调用异步方法时会发生什么?

Yan*_*hof 1 .net c# async-await

我试着理解为什么使用'Async'方法比使用简单的旧同步方法更好.

我不明白有一个小问题.

在同步方式:

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

在A同步方式:

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

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

(线程TheadAsync01现在正在做其他事情,无法继续使用' FileStream.ReadAsync'返回现在的工作.)

是其他线程会继续继续下一个动作的返回值ReadAsync吗?

我在这里不明白的是什么?

Ily*_*gan 5

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

线程TheadAsync01现在正在做其他事情,无法继续使用'FileStream.ReadAsync'返回的工作.

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

正确使用TPL时,线程不会被耗时的操作阻塞.相反,所有耗费时间(换句话说,任何I/O)都是通过委托进行的await.因此,当您的IRP发出信号时,线程将无法工作,或者很快就会免费.

如果有一些繁重的计算(耗费时间而不是 I/O),则需要进行相应的计划,例如在专用线程上运行它.