-
Notifications
You must be signed in to change notification settings - Fork 1k
/
Copy pathTaskExtensions.cs
38 lines (37 loc) · 1.23 KB
/
TaskExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Akka.Util.Internal
{
public static class TaskExtensions
{
public static Task<TResult> CastTask<TTask, TResult>(this Task<TTask> task)
{
if (task.IsCompleted)
return Task.FromResult((TResult) (object)task.Result);
var tcs = new TaskCompletionSource<TResult>();
if (task.IsFaulted)
tcs.SetException(task.Exception);
else
task.ContinueWith(_ =>
{
if (task.IsFaulted || task.Exception != null)
tcs.SetException(task.Exception);
else if (task.IsCanceled)
tcs.SetCanceled();
else
try
{
tcs.SetResult((TResult) (object) task.Result);
}
catch (Exception e)
{
tcs.SetException(e);
}
}, TaskContinuationOptions.ExecuteSynchronously);
return tcs.Task;
}
}
}