昨天阅读 corefx 中 System.Data.SqlClient 的源代码 SqlDataReader.cs 时发现用到了 TaskCompletionSource
TaskCompletionSource<bool> source = new TaskCompletionSource<bool>();
Task original = Interlocked.CompareExchange(ref _currentTask, source.Task, null);
if (original != null)
{
source.SetException(ADP.ExceptionWithStackTrace(SQL.PendingBeginXXXExists()));
return source.Task;
}
请问 TaskCompletionSource 的用途是什么?在什么情况下会用到它?
用途就是创建一个任务
IO密集型操作,生成一个任务会用到,
不是可以 new Task 吗?为什么要用 TaskCompletionSource 创建 Task ?
@dudu: new Task 没办法设置Task结果啊
阅读 The Nature of TaskCompletionSource 之后进一步解惑
在 Using Async with ManualResetEventSlim 这篇博文中基于 TaskCompletionSource 实现了 AsyncManualResetEvent
异步编程系列06章 以Task为基础的异步模式(TAP) ,这篇文章里有介绍
TaskCompletionSource<T>这是一种受你控制创建Task的方式。你可以使Task在任何你想要的时候完成,你也可以在任何地方给它一个异常让它失败。