AFAIK,它所知道的是,在某些时候,它的SetResultorSetException方法被调用来完成Task<T>通过它的Task属性暴露。
SetResult
SetException
Task<T>
Task
换句话说,它充当 aTask<TResult>及其完成的生产者。
Task<TResult>
我在 这里 看到了这个例子:
如果我需要一种方法来Func<T>异步执行 a 并有 aTask<T> 来表示该操作。
Func<T>
public static Task<T> RunAsync<T>(Func<T> function) { if (function == null) throw new ArgumentNullException(鈥渇unction鈥�); var tcs = new TaskCompletionSource<T>(); ThreadPool.QueueUserWorkItem(_ => { try { T result = function(); tcs.SetResult(result); } catch(Exception exc) { tcs.SetException(exc); } }); return tcs.Task; }
如果我没有 - 可以使用Task.Factory.StartNew- 但我 确实 有Task.Factory.StartNew。
Task.Factory.StartNew
问题:
有人可以通过示例解释一个与我没有的假设情况 直接 相关TaskCompletionSource 而不是与 假设Task.Factory.StartNew情况相关的场景吗?
TaskCompletionSource
我主要在只有基于事件的 API 可用时使用它(例如 Windows Phone 8 套接字):
public Task<Args> SomeApiWrapper() { TaskCompletionSource<Args> tcs = new TaskCompletionSource<Args>(); var obj = new SomeApi(); // will get raised, when the work is done obj.Done += (args) => { // this will notify the caller // of the SomeApiWrapper that // the task just completed tcs.SetResult(args); } // start the work obj.Do(); return tcs.Task; }
async因此,它与 C#5关键字一起使用时特别有用。
async