gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:56:37 25 4
gpt4 key购买 nike

我试图理解 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com