AFAIK,它所知道的是,在某个时候,它的SetResult
orSetException
方法被调用以完成Task<T>
通过其Task
属性公开的操作。
换句话说,它充当 aTask<TResult>
及其完成的生产者。
我在这里看到了这个例子:
如果我需要一种方法来
Func<T>
异步执行 a 并有 aTask<T>
来表示该操作。
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
情况相关的场景吗?