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

标签 c# .net 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");
}

请问,读 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/

相关文章:

asynchronous - 如何在生成器中使用 await?

C#:(float) (x/y) 和 x/(float) y 之间有区别吗?

c# - 如何正确继承克隆方法?

c# - REST PUT 似乎无法连接到服务器

.net - Visual Git 208 加载项无法在 Windows 7/Visual Studio 2010 下运行

javascript - 如何使用 jQuery 将 ajax 调用的结果存储在函数中?

c# - 尝试将文件名添加到字符串末尾时出错 :

c# - 在 C# 中使用 MongoClientSettings 初始化 MongoClient

c# - 在 C# 中自动实现的属性默认值

javascript - Node js将变量传递给请求回调函数