asynchronous - TaskCompletionSource - 尝试理解无线程异步工作

标签 asynchronous task-parallel-library

我试图理解 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 的精彩帖子:

  • The Nature of TaskCompletionSource
  • Mechanisms for Creating Tasks
  • await anything; (使用 TaskCompletionSourceawait 任何东西)。
  • Using Tasks to implement the APM Pattern (创建 Begin/End 使用 TaskCompletionSource )。
  • 关于asynchronous - TaskCompletionSource - 尝试理解无线程异步工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419747/

    相关文章:

    ios - cocos2d无法异步添加child

    c# - 如何在 Web Api Controller c# 中使用异步/等待任务连接数据库并返回值

    Android 异步 Http 获取请求

    c# - 为什么分配任务然后等待它允许并行运行

    c# - 如何同步.NET中的并行 Action ?

    c# - 如何同步共享的 IProgress<int>

    .net - 在 Web API 中实现 MediaTypeFormatter.WriteToStreamAsync 的正确方法

    javascript - 如何使用 async/await 从 fetch 函数保存数据

    c# - 使用多个任务/消费者使用阻塞集合

    c# - 如何将 task.Wait(CancellationToken) 转换为 await 语句?