【问题标题】:c# check of threadpool and other threadsc#检查线程池和其他线程
【发布时间】:2013-08-05 21:59:26
【问题描述】:

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

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

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

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

谢谢, 达伦

【问题讨论】:

  • ThreadPool.GetAvailableThreads(),与 GetMaxThreads() 进行比较。当代码留下悬空的 tp 线程时,您可能应该无法通过测试,这也不太可能在生产中取得好的结果。

标签: c# multithreading unit-testing threadpool


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    相关资源
    最近更新 更多