我目前正在将数据库存储过程调用转换为异步,利用async / await。与描述的方法类似here。
基于this answer,我想验证异步调用是否实际使用I / O完成端口。如果它最终等待来自ThreadPool的另一个线程,那么它实际上是在破坏转换呼叫的目的。
验证正在使用I / O完成端口的最佳方法是什么?它不仅仅是在另一个线程上阻塞?
答案 0 :(得分:3)
并行调用WAITFOR DELAY '1:00:00'
1000次。如果使用的线程少于1000个,那么您将获得无线程IO。您应该看到几十个(其中包括许多由运行时和框架启动的实用程序线程)。
您也可以打破调试器并确保当前没有线程正在等待IO。你可以从堆栈跟踪中看出来。这适用于任何现有的应用程序。
答案 1 :(得分:0)
我会创建一些perfmon计数器并在线程池线程中更新它们。然后,您可以观看正在使用的应用程序,并查看在任何给定时间正在使用的线程数,这反过来可能会帮助您调整数量。你也可以记录每个线程所花费的时间,并计算一下,这样你就可以看到平均等待时间,这可以帮助你确定它们是否被阻止了,虽然我认为线程的数量也会显示出来 - 因为你'如果他们互相等待,他们会立即看到几个完整的。取决于你正在做的工作。
我多年前为一个网络应用程序做过,它对于调整应用程序的性能非常有用。