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

时间:2013-08-05 08:51:03

标签: c# multithreading unit-testing threadpool

基本上 - 我们编写单元测试。有时,这些单元测试会启动线程 - 并且经常在线程池上启动任务。如果后台线程出现问题 - 它可能会导致 future 测试出现奇怪问题。我们想要对每个测试的基本拆分做什么基本上是

  • 检查正在运行的线程
  • 如果有任何不应该
  • 的运行,则测试失败

现在,对于普通线程,我们可以事先枚举,然后比较 - 这很好。线程池搞砸了 - 因为可能有许多有效创建的新线程,它们只是在等待无所事事 - 这很好。如果测试留下了一些东西,那就没关系了。还记得 - 我不是在编写测​​试或正在测试的代码 - 我正在编写底层库,试图确保没有其他人可以搞砸了,无论他们怎么努力 - 所以我不能尝试使用我自己的实现一个线程池或类似的东西,因为我不能确定有人没有使用标准的。

任何人都可以想办法告诉线程池拥有哪些线程,以及它们是否空闲?我的下一步是通过反射查看私有变量 - 但我希望有人有更好的方法吗?

谢谢, 达伦

1 个答案:

答案 0 :(得分:0)

我推断你正在使用“即发即弃”式线程/任务/工作项。如果你不是,那么你就不会有在测试后继续运行的问题。

我认为即使在单元测试之外(在生产中),你也不会忘记错误。此外,在ASP.NET中,您无法保证后台工作将完成,因为工作进程可以在处理完所有挂起的HTTP请求之后和后台工作完成之前关闭。

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

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

在任何情况下,线程池都不允许您监听排队的项目或完成。您需要在自己的代码中解决此问题。