我在我的一些项目中使用异步方法,我喜欢它,因为它使我的应用程序更具可扩展性。但是,我想知道异步方法如何在后台真正工作? .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,等等)。如何监控异步方法调用的实际持续时间(从请求真正执行的那一刻到结束)?
UPDATE: 异步方法会阻塞流程吗?据我所知,它使用 .NETThreadPool
但如何IAsyncResult
知道通话已完成,是时候拨打电话了CallBack
method?
代码是铁路,线程是火车。当火车在铁路上行驶时,它会执行代码。
BeginMyMethod
由主线程执行。如果你看里面BeginMyMethod
它只是添加了一个委托MyMethod
to the ThreadPool
的队列。实际上MyMethod
由列车池中的一列列车执行。当以下情况时调用的完成例程MyMethod
完成是由执行的同一线程执行的MyMethod
,而不是由运行其余代码的主线程执行。当线程池线程正忙于执行时MyMethod
,主线程可以乘坐铁路系统的其他部分(执行其他代码),或者只是休眠,等待某些信号量被点亮。
因此,不存在这样的事情IAsyncResult
“知道”何时调用完成例程,相反,完成例程只是线程池的线程在执行完毕后立即调用的委托MyMethod
.
我希望您不要介意有点幼稚的火车比喻,我知道它在向人们解释多线程时不止一次地帮助了我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)