我试图理解 TaskCompletionSource
的目的以及它与异步/无线程工作的关系。我想我有大致的想法,但我想确保我的理解是正确的。
我首先开始研究任务并行库 (TPL),以确定是否有一种好方法可以创建您自己的无线程/异步工作(比如您正在尝试提高 ASP.NET 站点的可伸缩性)以及对 TPL 的理解看起来它在 future 会非常重要( async
/await
)。这让我找到了 TaskCompletionSource
.
根据我的理解,它看起来像是添加 TaskCompletionSource
到你的一个类并没有真正使你的编码异步;如果您仍在执行同步代码,则对您的代码的调用将被阻止。我认为这甚至适用于微软 API。例如,在 DownloadStringTaskAsync
中说关闭 WebClient
类,他们最初执行的任何设置/同步代码都会被阻止。您正在执行的代码必须在某个线程上运行,要么是当前线程,要么您将不得不衍生出一个新线程。
所以你用 TaskCompletionSource
当你调用其他人时,在你自己的代码中 async
来自 Microsoft 的调用,因此您的类的客户端不必为您的类创建新线程以防止阻塞。
不确定 Microsoft 如何在内部执行其异步 API。例如,有一个新的 async
方法关闭SqlDataReader
对于 .Net 4.5。我知道有 IO 完成端口。我认为这是一个较低级别的抽象(C++?),可能大多数 C# 开发人员都不会使用。不确定 IO 完成端口是否适用于数据库或网络调用 (HTTP) 或者它是否仅用于文件 IO。
所以问题是,我的理解正确吗?有没有我表述错误的事情?
最佳答案
TaskCompletionSource
用于创建Task
不执行代码的对象。
它们被 Microsoft 的新异步 API 大量使用——任何时候都有基于 I/O 的异步操作(或其他非基于 CPU 的异步操作,如超时)。此外,任何 async Task
您编写的方法将使用 TCS 来完成其返回的 Task
.
我有一篇博文 Creating Tasks讨论了不同的创建方式 Task
实例。它来自 async
/await
视角(不是 TPL 视角),但它仍然适用于这里。
另请参阅 Stephen Toub 的精彩帖子:
TaskCompletionSource
到 await
任何东西)。 Begin
/End
使用 TaskCompletionSource
)。 关于asynchronous - TaskCompletionSource - 尝试理解无线程异步工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419747/