我试图了解TaskCompletionSource
异步/无线程工作的目的及其关系。我想我有一个大致的想法,但我想确保我的理解是正确的。
我首先开始研究任务并行库 (TPL),以确定是否有一种创建自己的无线程/异步工作的好方法(假设您正在尝试提高 ASP.NET 站点的可伸缩性)以及对 TPL 的理解看起来它在未来将非常重要(async
/ await
)。这导致了我TaskCompletionSource
。
根据我的理解,添加TaskCompletionSource
到你的一个类中并没有真正使你的编码异步。如果您仍在执行同步代码,那么对您的代码的调用将被阻止。我认为微软 API 也是如此。例如,在DownloadStringTaskAsync
课外WebClient
,他们最初执行的任何设置/同步代码都会阻塞。您正在执行的代码必须在某个线程上运行,要么是当前线程,要么您将不得不分拆一个新线程。
因此TaskCompletionSource
,当您从 Microsoft 调用其他调用时,您可以在自己的代码中使用,async
这样您的类的客户端就不必为您的类创建新线程而不会阻塞。
不确定 Microsoft 如何在内部执行其异步 API。例如,.Net 4.5 有一种新async
方法SqlDataReader
。我知道有 IO 完成端口。我认为这是大多数 C# 开发人员可能不会使用的较低级别的抽象(C++?)。不确定 IO 完成端口是否适用于数据库或网络调用 (HTTP),或者它是否仅用于文件 IO。
所以问题是,我的理解正确吗?是否有某些事情我代表不正确?