2

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

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

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

谁能想到一种方法来判断线程池拥有哪些线程,以及它们是否处于空闲状态?我的下一步是通过反射查看私有变量 - 但我希望有人有更好的方法?

谢谢,达伦

4

1 回答 1

0

我推断您正在使用即发即弃风格的线程/任务/工作项。如果你不是,你就不会有他们在测试后继续运行的问题。

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

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

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

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

于 2013-08-05T09:37:28.497 回答