c#检查线程池和其他线程
本文关键字:线程 其他 检查 | 更新日期: 2023-09-27 18:26:30
基本上,我们编写单元测试。有时,这些单元测试启动线程,并且通常启动线程池上的任务。如果后台线程出现问题,可能会导致未来测试出现奇怪问题。我们想在每次测试的基础上做的基本上是
- 检查哪些线程正在运行
- 如果有不应该运行的,则测试失败
现在,对于普通线程,我们可以先枚举,然后再进行比较,这很好。线程池把事情搞砸了——因为可能已经有很多新的线程被有效地创建了,它们只是在等待什么都不做——这很好。如果测试没有运行,那就不好了。还要记住,我不是在写测试或正在测试的代码,我是在写底层库,试图确保其他人不会把事情搞砸,无论他们多么努力——所以我不能尝试使用我自己的线程池实现或类似的东西,因为我不能确定有人没有使用标准的。
有人能想出一种方法来判断线程池拥有哪些线程,以及它们是否空闲吗?我的下一步是通过反思的方式在私人变量中爬行——但我希望有人能有更好的方法?
谢谢,Darren
我推断您使用的是即发即弃风格的线程/任务/工作项。如果你不这样做,你就不会遇到它们在测试后继续运行的问题。
我认为即发即弃是一个有问题的模式,因为即使在单元测试之外(在生产中),你也永远不想忘记错误。此外,在ASP.NET中,不能保证后台工作会完成,因为在处理完所有挂起的HTTP请求之后以及后台工作完成之前,工作进程可能会关闭。
因此,我建议您审核代码,并将所有并发切换到新的基于Task
的模型。这允许您跟踪完成情况。它还允许您等待完成并传播错误。
您可以将所有已启动的任务添加到列表中(可能使用自定义TaskScheduler
,也可能手动)。当单元测试关闭时,您对该列表的内容执行Task.WaitAll
。这保证了你的完成。
在任何情况下,线程池都不允许您侦听入队项目或完成。你需要在自己的代码中解决这个问题。