gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:26 24 4
gpt4 key购买 nike

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

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

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

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

谢谢,达伦

最佳答案

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

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

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com