/
TaskExtensions.cs
95 lines (85 loc) · 2.98 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ServiceStack;
public static class TaskExtensions
{
public static Task<T> Success<T>(this Task<T> task, Action<T> fn,
bool onUiThread = true,
TaskContinuationOptions taskOptions = TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.OnlyOnRanToCompletion)
{
if (onUiThread)
{
var source = new CancellationToken();
task.ContinueWith(t => fn(t.Result), source, taskOptions, TaskScheduler.FromCurrentSynchronizationContext());
}
else
{
task.ContinueWith(t => fn(t.Result), taskOptions);
}
return task;
}
public static Task Success(this Task task, Action fn,
bool onUiThread = true,
TaskContinuationOptions taskOptions = TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.OnlyOnRanToCompletion)
{
if (onUiThread)
{
var source = new CancellationToken();
task.ContinueWith(t => fn(), source, taskOptions, TaskScheduler.FromCurrentSynchronizationContext());
}
else
{
task.ContinueWith(t => fn(), taskOptions);
}
return task;
}
public static Task<T> Error<T>(this Task<T> task, Action<Exception> fn,
bool onUiThread = true,
TaskContinuationOptions taskOptions = TaskContinuationOptions.OnlyOnFaulted)
{
if (onUiThread)
{
var source = new CancellationToken();
task.ContinueWith(t => fn(t.UnwrapIfSingleException()), source, taskOptions, TaskScheduler.FromCurrentSynchronizationContext());
}
else
{
task.ContinueWith(t => fn(t.UnwrapIfSingleException()), taskOptions);
}
return task;
}
public static Task Error(this Task task, Action<Exception> fn,
bool onUiThread = true,
TaskContinuationOptions taskOptions = TaskContinuationOptions.OnlyOnFaulted)
{
if (onUiThread)
{
var source = new CancellationToken();
task.ContinueWith(t => fn(t.UnwrapIfSingleException()), source, taskOptions, TaskScheduler.FromCurrentSynchronizationContext());
}
else
{
task.ContinueWith(t => fn(t.UnwrapIfSingleException()), taskOptions);
}
return task;
}
public static Exception UnwrapIfSingleException<T>(this Task<T> task)
{
return task.Exception.UnwrapIfSingleException();
}
public static Exception UnwrapIfSingleException(this Task task)
{
return task.Exception.UnwrapIfSingleException();
}
public static Exception UnwrapIfSingleException(this Exception ex)
{
var aex = ex as AggregateException;
if (aex == null)
return ex;
if (aex.InnerExceptions != null
&& aex.InnerExceptions.Count == 1)
return aex.InnerExceptions[0].UnwrapIfSingleException();
return aex;
}
}