繁体   English   中英

C#检查线程池和其他线程

[英]c# check of threadpool and other threads

基本上-我们编写单元测试。 有时,那些单元测试会启动线程-并经常在线程池上启动任务。 如果后台线程出了点问题,可能会在以后的测试中引起奇怪的问题。 我们希望在每个测试的基础拆解基础上要做的基本上是

  • 检查正在运行的线程
  • 如果正在运行的测试不应该通过测试

现在,对于普通线程,我们可以事先枚举,然后与之后进行比较-很好。 线程池将事情搞砸了-因为可能已经有效地创建了许多新线程,而这些线程只是无所事事地等待着-很好。 如果测试使某些程序无法运行,那就不好了。 还要记住-我不是在编写测​​试或正在测试的代码-我正在编写底层库,试图确保没有其他人可以搞砸事情,不管他们努力尝试了什么-所以我不能尝试使用自己的实现线程池之类的东西,因为我不能确定有人没有使用标准线程池。

谁能想到一种方法来告诉线程池拥有哪些线程,以及它们是否空闲? 我的下一步是使用反射外观来爬网私有变量-但我希望有人有更好的方法吗?

谢谢,达伦

我推断您正在使用即弃型样式线程/任务/工作项。 如果不是,您将不会遇到问题,因为它们在测试后仍会继续运行。

我认为“一劳永逸”是一个有问题的模式,因为即使在单元测试之外(在生产中),您也永远不会忘记错误。 另外,在ASP.NET中,不能保证后台工作将永远完成,因为在处理完所有待处理的HTTP请求之后以及完成后台工作之前,工作进程可能会关闭。

因此,我建议您审核代码并将所有并发切换到新的基于Task的模型。 这样就可以跟踪完成情况。 它还允许您等待完成并传播错误。

您可以将所有已启动的任务添加到列表中(可能使用自定义TaskScheduler ,也可能手动使用)。 当单元测试关闭时,您对该列表的内容执行Task.WaitAll 那保证您完成。

无论如何,线程池都不允许您监听排队的项目或完成。 您需要用自己的代码解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM