AFAIK,它所知道的是,在某些时候,它SetResult或SetException方法被调用以Task<T>通过其Task属性完成暴露.
换句话说,它充当a 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;
}
Run Code Online (Sandbox Code Playgroud)
可以使用*如果我没有Task.Factory.StartNew- 但我确实有Task.Factory.StartNew.
题:
可有人请举例相关的情景解释直接到TaskCompletionSource
而不是一个假想中,我没有的情况 Task.Factory.StartNew?