AFAIK,它所知道的只是在某个时候,它的SetResult或SetException方法被调用以Task<T>通过其Task属性完成公开。
SetResult
SetException
Task<T>
Task
换句话说,它充当a Task<TResult>及其完成的生产者。
Task<TResult>
我在 这里 看到了示例:
如果我需要一种异步执行Func并有一个Task来表示该操作的方法。
public static Task<T> RunAsync<T>(Func<T> function) { if (function == null) throw new ArgumentNullException(“function”); 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; }
因此,与C#5 async关键字一起使用时,它特别有用。
async