在C#中,当我调用BeginXXX时有两个线程

roa*_*oul 5 .net c# asynchronous

我对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");
}
Run Code Online (Sandbox Code Playgroud)

我想知道,IO线程异步执行的读取操作是什么?还是线程池中的工作线程?

和回调函数一样OnCompletedRead,它是否也由CLR线程池中的IO线程执行?

这两个线程是同一个吗?如果没有,则生成两个线程,一个执行读取操作,另一个执行回调.

mcl*_*sen 5

如果你没有在BeginRead中使用AsyncCallback参数,那么只有一个线程在你的程序中运行代码.这使用IO完成端口通过在IO线程池中的线程上运行少量代码来完成IO完成时的信号,以更新操作的状态.当您调用EndRead时,它将阻止当前线程,直到IO操作完成.它是异步的,当你开始读取操作时,当前线程除了等待IO硬件执行读取操作之外不需要做任何事情,所以你可以在此期间做其他事情,然后决定你想什么时候停止并等待IO完成.

如果确实传入了AsyncCallback,那么当IO操作完成时,它将在IO线程池线程上执行少量代码,这将触发您的回调方法在.NET线程池的线程上执行.