如何验证我的async / await是否正在使用I / O完成端口?

时间:2013-09-11 11:37:50

标签: c# sql-server-2008 asynchronous

我目前正在将数据库存储过程调用转换为异步,利用async / await。与描述的方法类似here

基于this answer,我想验证异步调用是否实际使用I / O完成端口。如果它最终等待来自ThreadPool的另一个线程,那么它实际上是在破坏转换呼叫的目的。

验证正在使用I / O完成端口的最佳方法是什么?它不仅仅是在另一个线程上阻塞?

2 个答案:

答案 0 :(得分:3)

并行调用WAITFOR DELAY '1:00:00' 1000次。如果使用的线程少于1000个,那么您将获得无线程IO。您应该看到几十个(其中包括许多由运行时和框架启动的实用程序线程)。

您也可以打破调试器并确保当前没有线程正在等待IO。你可以从堆栈跟踪中看出来。这适用于任何现有的应用程序。

答案 1 :(得分:0)

我会创建一些perfmon计数器并在线程池线程中更新它们。然后,您可以观看正在使用的应用程序,并查看在任何给定时间正在使用的线程数,这反过来可能会帮助您调整数量。你也可以记录每个线程所花费的时间,并计算一下,这样你就可以看到平均等待时间,这可以帮助你确定它们是否被阻止了,虽然我认为线程的数量也会显示出来 - 因为你'如果他们互相等待,他们会立即看到几个完整的。取决于你正在做的工作。

我多年前为一个网络应用程序做过,它对于调整应用程序的性能非常有用。