|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace Raven.Client.Shard.ShardStrategy.ShardAccess
{
internal static class ParallelExtensions
{
public static void WaitAll(this IEnumerable<Task> tasks)
{
try
{
Task.WaitAll(tasks.ToArray());
}
catch (Exception ex)
{
//when task takes exception it wraps in aggregate exception, if in continuation
//then could be double wrapped, etc. This should always get us the original
while (true)
{
if (ex.InnerException == null || !(ex is AggregateException))
{
throw PreserveStackTrace(ex);
}
ex = ex.InnerException;
}
}
}
private static Exception PreserveStackTrace(Exception exception)
{
typeof (Exception).InvokeMember("InternalPreserveStackTrace", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null,
exception, null);
return exception;
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
I've been a software developer since 1996 and have enjoyed C# since 2003. I have a Bachelor's degree in Computer Science and for some reason, a Master's degree in Business Administration. I currently do software development contracting/consulting.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.