public
Last active

Converts .NET TPL async task pattern to the APM pattern. See [Stephen Toub's blog post](http://blogs.msdn.com/b/pfxteam/archive/2011/06/27/10179452.aspx)

  • Download Gist
ApmExtensions.cs
C#
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
// LICENSED under the Ms-PL (http://opensource.org/licenses/MS-PL)
 
public static Task<TResult> ToApm<TResult>(this Task<TResult> task, AsyncCallback callback, object state) {
if (task == null) {
throw new ArgumentNullException("task");
}
 
if (task.AsyncState == state) {
if (callback != null) {
task.ContinueWith(
(t, cb) => ((AsyncCallback)cb)(t),
callback,
CancellationToken.None,
TaskContinuationOptions.None,
TaskScheduler.Default);
}
 
return task;
}
 
var tcs = new TaskCompletionSource<TResult>(state);
task.ContinueWith(
t => {
if (t.IsFaulted) {
tcs.TrySetException(t.Exception.InnerExceptions);
} else if (t.IsCanceled) {
tcs.TrySetCanceled();
} else {
tcs.TrySetResult(t.Result);
}
 
if (callback != null) {
callback(tcs.Task);
}
 
},
CancellationToken.None,
TaskContinuationOptions.None,
TaskScheduler.Default);
 
return tcs.Task;
}
 
public static Task ToApm(this Task task, AsyncCallback callback, object state) {
if (task == null) {
throw new ArgumentNullException("task");
}
 
if (task.AsyncState == state) {
if (callback != null) {
task.ContinueWith(
(t, cb) => ((AsyncCallback)cb)(t),
callback,
CancellationToken.None,
TaskContinuationOptions.None,
TaskScheduler.Default);
}
 
return task;
}
 
var tcs = new TaskCompletionSource<object>(state);
task.ContinueWith(
t => {
if (t.IsFaulted) {
tcs.TrySetException(t.Exception.InnerExceptions);
} else if (t.IsCanceled) {
tcs.TrySetCanceled();
} else {
tcs.TrySetResult(null);
}
 
if (callback != null) {
callback(tcs.Task);
}
},
CancellationToken.None,
TaskContinuationOptions.None,
TaskScheduler.Default);
 
return tcs.Task;
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.