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;
}
*如果我没有,可以使用Task.Factory.StartNew
-但我确实有Task.Factory.StartNew
。
题:
可有人请举例相关的情景解释直接到TaskCompletionSource
而不是一个假想中,我没有的情况 Task.Factory.StartNew
?