我对 IOCP 有所了解,但我对 APM 有点困惑。
static FileStream fs;
static void Main(string[] args)
{
fs = new FileStream(@"c:\bigfile.txt", FileMode.Open);
var buffer = new byte[10000000];
IAsyncResult asyncResult = fs.BeginRead(buffer, 0, 10000000, OnCompletedRead, null);
Console.WriteLine("async...");
int bytesRead = fs.EndRead(asyncResult);
Console.WriteLine("async... over");
}
static void OnCompletedRead(IAsyncResult ar)
{
Console.WriteLine("finished");
}
请问,读 Action 是不是IO线程异步执行的?还是线程池中的工作线程?
还有回调函数OnCompletedRead
,是否也是CLR线程池中的一个IO线程执行的?
这两个线程是同一个线程吗?如果没有,则生成两个线程,一个执行读取操作,另一个执行回调。
最佳答案
如果您不对 BeginRead 使用 AsyncCallback 参数,那么只有一个线程在您的程序中运行代码。这使用 IO 完成端口在 IO 完成时发出信号,方法是在 IO 线程池中的线程上运行少量代码以将操作的状态更新为已完成。当您调用 EndRead 时,它将阻塞当前线程,直到 IO 操作完成。它是异步的,因为当你开始读操作时,当前线程除了等待IO硬件执行读操作外不需要做任何事情,所以你可以同时做其他事情,然后决定什么时候停止并等待 IO 完成。
如果您确实传入 AsyncCallback,那么当 IO 操作完成时,它将在 IO 线程池线程上执行少量代码,这将触发您的回调方法在 .NET 线程池中的线程上执行。
关于c# - 在 C# 中,当我调用 BeginXXX 时有两个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25122155/