什么时候应该使用TaskCompletionSource? AFAIK,所有它知道的是,在某个时候,它的SetResult或SetException方法正在被调用来完成通过其Task属性公开的Task<T> 。 换句话说,它作为一个Task<TResult>及其完成的生产者。 我在这里看到了这个例子: 如果我需要一种方法来asynchronous执行一个Func,并有一个任务来表示该操作。 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 ?