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

标签 c# multithreading unit-testing threadpool

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

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

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

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

谢谢, 达伦

最佳答案

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

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

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

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

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

关于c# 检查线程池和其他线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18054031/

相关文章:

c++ - 了解#pragma omp parallel

spring - 当我已经有集成测试时,我应该为 CRUD 操作编写单元测试吗?

c# - 从字节数组 C# 中读取特定字节

javascript - 输入类型文本不应是可编辑的

c# - 每x秒同时启动几个功能吗?

java - 使用 System.out.print 按顺序打印 RED BLUE GREEN

javascript - anchor 元素的路径名在 Rhino 中使用 env.js 返回未定义

asp.net - 在 Asp.net 页面中测试 UI?

c# - 在 tagLib sharp 中添加自定义标签

c# - 应用程序池模式问题 : Classic Or Integrated