我正在执行将Task
的结果复制到TaskCompletionSource
的标准操作:
TaskCompletionSource<int> tcs = ...;
Task<int> task = ...;
task.ContinueWith(t =>
{
if (t.IsCanceled)
tcs.TrySetCanceled(new TaskCanceledException(task).CancellationToken);
else if (t.IsFaulted)
tcs.TrySetException(task.Exception.InnerExceptions);
else
tcs.TrySetResult(task.Result);
});
您可能会注意到有一些有趣的代码来设置触发取消的令牌。这是我试图做一点清洁的部分。
作为一个实现细节,有一个Task.CancellationToken
成员可以访问,但它是内部的。构建一个新的TaskCanceledException
是我能找到的最便宜的方式来访问它。还有更好的方法吗?