DotNETWeekly-io / DotNetWeekly

DotNet weekly newsletter
MIT License
207 stars 3 forks source link

【文章推荐】IO操作没有线程 #616

Closed gaufung closed 4 months ago

gaufung commented 5 months ago

https://blog.stephencleary.com/2013/11/there-is-no-thread.html?ref=codetraveler.io

gaufung commented 5 months ago

image

C# 异步代码中,常常有人会有这样的一个疑问,是不是有一个线程在等待异步的完成,比如

private async void Button_Click(object sender, RoutedEventArgs e)
{
  byte[] data = ...
  await myDevice.WriteAsync(data, 0, data.Length);
}

WriteAsync 方法中,是不是有一个线程在调用这个方法。答案是否定的。没有任何一个线程调用这个方法,这个要从 CPU 的硬件底层来讲,当硬件开始一个 I/O 操作的时候,CPU 会继续处理其他事情,当 I/O 操作完成之后,会给 CPU 发出一个中断的信号,这时候内容的应用程序会将后续的操作作为一个 continuation 塞入某个线程的队列中。