gpt4 book ai didi

c# - 调用异步方法时到底发生了什么?

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:56 25 4
gpt4 key购买 nike

我试图理解为什么使用“异步”方法比使用简单的旧同步方法更好。

有一个小问题,我不明白。

在同步方式上:

  1. 我有一些调用方法 FileStream.Read(...) 的线程。
  2. 因为调用此方法是同步的,所以调用线程将等待 IRP(I/O 请求数据包)发出此 Io 请求已完成的信号。直到 IRP 返回 ==> 此线程将挂起( sleep )。

异步方式:

  1. 我有一些调用方法 FileStream.ReadAsync(...) 的线程(任务 .. 让我们将此线程称为“TheadAsync01”)。
  2. 因为调用此方法是 A-Synchronous,所以调用线程不会等到 IRP(I/O 请求包)将发出此 IO 请求已完成的信号;这个调用线程将继续执行他的下一个操作。

现在,当 IRP 将发出此 IO 请求已完成的信号时发生了什么?

(线程 TheadAsync01 现在正在做其他事情,无法继续处理“FileStream.ReadAsync”现在返回的内容。)

其他线程是否会使用 ReadAsync 的返回值继续执行下一个操作?

这里有什么我不明白的?

最佳答案

它困扰你的原因是这个错误的假设:

The thread TheadAsync01 is now doing something else and can't continue the work with what the 'FileStream.ReadAsync' return now.

在典型的应用程序中,I/O 是迄今为止最耗时的任务。

正确使用TPL时,线程不会被耗时操作阻塞。相反,所有耗时的事情(换句话说,任何 I/O)都通过 await 委托(delegate)。因此,当您的 IRP 发出信号时,该线程要么停止工作,要么很快空闲。

如果有一些繁重的计算(一些耗时的不是 I/O),您需要相应地计划,例如在专用线程上运行它。

关于c# - 调用异步方法时到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29790672/

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