6

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

基于这个答案,我想验证异步调用实际上是在使用 I/O 完成端口。如果它最终在等待来自 ThreadPool 的另一个线程,那么它实际上违背了转换调用的目的。

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

4

2 回答 2

3

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

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

于 2013-09-11T14:21:05.073 回答
0

我会创建一些性能计数器并在线程池线程中更新它们。然后您可以查看正在使用的应用程序,并查看在任何给定时间有多少线程正在使用,这反过来可能有助于您调整数量。您还可以记录每个线程所花费的时间,并计算它,这样您就可以看到平均等待时间,这将帮助您确定它们是否被阻塞,尽管我认为线程数也会显示这一点 - 因为你d 如果他们在等待对方,他们会同时看到几个完成。取决于你正在做的工作。

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

于 2013-09-11T14:24:40.440 回答