【发布时间】:2020-04-09 14:52:42
【问题描述】:
我试图了解TaskCompletionSource 的用途及其与异步/无线程工作的关系。我想我有一个大致的想法,但我想确保我的理解是正确的。
我首先开始研究任务并行库 (TPL),以了解是否有一种创建自己的无线程/异步工作的好方法(例如,您正在尝试提高 ASP.NET 站点的可扩展性)以及了解的 TPL 看起来它将在未来非常重要(async/await)。这让我找到了TaskCompletionSource。
根据我的理解,将TaskCompletionSource 添加到您的一个类中并没有真正起到使您的编码异步的作用;如果您仍在执行同步代码,那么对您的代码的调用将被阻止。我认为微软 API 也是如此。例如,在WebClient 类之外的DownloadStringTaskAsync 中,他们最初执行的任何设置/同步代码都会阻塞。您正在执行的代码必须在某个线程上运行,要么是当前线程,要么您将不得不派生一个新线程。
因此,当您从 Microsoft 调用其他 async 调用时,您可以在自己的代码中使用 TaskCompletionSource,这样您的类的客户端就不必为您的类创建新线程以免阻塞。
不确定 Microsoft 如何在内部执行其异步 API。例如,对于 .Net 4.5,SqlDataReader 有一个新的 async 方法。我知道有 IO 完成端口。我认为这是大多数 C# 开发人员可能不会使用的较低级别的抽象(C++?)。不确定 IO 完成端口是否适用于数据库或网络调用 (HTTP),或者它是否仅用于文件 IO。
所以问题是,我的理解是否正确?是不是有些东西我表述不正确?
【问题讨论】:
-
如果我的理解是正确的......不确定是不是
标签: asynchronous task-parallel-library