gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:58:47 24 4
gpt4 key购买 nike

我对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com