gpt4 book ai didi

c# - 异步方法在 C# 中如何工作?

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

我在我的一些项目中使用了异步方法,我喜欢它,因为它使我的应用程序更具可扩展性。但是,我想知道异步方法在后台是如何工作的? .NET(或 Windows?)如何知道调用已完成?根据我进行的异步调用的数量,我可以看到创建了新线程(尽管并不总是……)。为什么?

此外,我想监控一个请求需要多长时间才能完成。为了测试这个概念,我编写了以下代码,它异步调用 Web 服务并在启动秒表后立即调用。

for (int i = 0; i < 10000; i++)
{
myWebService.BeginMyMethod(new MyRequest(), result, new AsyncCallback(callback), i);
stopWatches[i].Start();
}
// Call back stop the stopwatch after calling EndMyMethod

这不起作用,因为所有请求 (10000) 都有相同的开始时间,并且持续时间将线性增加(调用 0 = 持续时间 1,调用 1 = 持续时间 2,等等)。我如何监控使用异步方法调用的实际持续时间(从请求真正执行到结束的那一刻)?


更新:异步方法是否会阻塞流程?我知道它使用 .NET ThreadPoolIAsyncResult 如何知道调用已完成并且是时候调用 CallBack 方法了?

最佳答案

代码是铁路,线程是火车。当火车在铁路上行驶时,它会执行代码。

BeginMyMethod 由主线程执行。如果您查看 BeginMyMethod 内部,它只是将 MyMethod 的委托(delegate)添加到 ThreadPool 的队列中。实际的 MyMethod 由训练池中的一个训练执行。 MyMethod 完成时调用的完成例程由执行 MyMethod 的同一线程执行,而不是由运行其余代码的主线程执行。当线程池线程忙于执行 MyMethod 时,主线程可以乘坐铁路系统的其他部分(执行其他代码),或者干脆休眠,等待某个信号灯亮起。

因此,IAsyncResult 并不“知道”何时调用完成例程,相反,完成例程只是线程池线程在执行完 MyMethod 后立即调用的委托(delegate)

我希望你不介意这个有点幼稚的火车类比,我知道它不止一次地帮助我向人们解释多线程。

关于c# - 异步方法在 C# 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1616543/

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