【问题标题】:.NET Threads and Garbage Collection/Phantom process.NET 线程和垃圾收集/幻象进程
【发布时间】:2018-09-21 03:39:35
【问题描述】:

我目前正在尝试找出如何最好地将 .NET Core 2.x 应用程序作为 Windows 服务运行,特别是为消息传递系统运行 NServiceBus 端点。我最初的原型是由 Particular 的一些Windows Service hosting docs 构建的。然后,我把这个功能原型变成了一个 .NET Standard 库,供其他团队成员构建,但发现它对他们(或者如果我离开它 2 周,对我自己来说)不是超级直观。

自然地,在我构建了一个可运行的原型并将其部署到生产环境后,我发现了一个更优雅的解决方案,它使用了 .NET Core 的GenericHostBuilder,由Mr. Steve Gordon 提供。大部分代码对我来说是有意义的,但我挂断了new Thread(...).Start();,可能是因为我没有在 C# 和 .NET 中使用 Thread 的任何具体经验。

  1. new@Thread 并保持不提及它感觉真的不对。我担心这样做可能会导致内存泄漏或垃圾收集器会捡起它?我确实找到了this SO 答案,这让我放心,即使我没有引用Thread,CLR 也会。所以听起来应该不用担心 GC 会终结线程,对吧?
  2. 谁能向我解释为什么Abort() 不被称为Thread?是不是因为 CLR 管理线程,知道在主线程关闭时停止其他线程?还是和IHostLifetime.StopAsync()方法中调用ServiceBase.Stop()方法有关系?

如果可以在某处的 Thread 的一些文档中解释这些事情,我很高兴获得“RTFM”并找到这些文档。在这一点上,我只是没有找到任何可以给我明确解释的东西。

【问题讨论】:

  • 正确编写多线程 C# 程序极其困难,您甚至连最基本的内容都不懂。 寻找专家来帮助您。你会弄错,更糟糕的是,它会以微妙的方式出错,不会出现在测试中,但会出现在生产中。
  • 我向您保证,我了解多线程编程的基础知识,并且了解多线程程序可能会导致难以检测的错误(我已经编写了一些多线程的东西,并且我自己也看到过)。但是你说得对,我还没有使用 C# 进行多线程。
  • 更好的是,与其告诉我“寻找专家”,不如给我指出一些要阅读的文档或材料,以便我可以学习和成长?也许我没有可用的 C# 多线程“专家”?
  • 要求场外教程是本网站的明确主题。也就是说,C# in a Nutshell 中的线程章节非常好。我是最近一期的编辑。

标签: c# multithreading .net-core windows-services nservicebus


【解决方案1】:

当线程执行完成并超出范围时,垃圾收集器最终会回收资源(如果感觉需要)。 Thread 也没有实现 IDisposable,所以你真的不需要因为它到处闲逛而烦恼自己(除非你在其中执行无限循环)

关于Thread.AbortThread.Interrupt,我诚实的回答是你永远不应该使用这两种方法来终止线程。建议完全不要使用Thread.AbortThread.Interrupt 方法——您应该利用同步对象(如WaitHandles 或Semaphores 等)并优雅地终止您正在使用的线程。

明智的words of Eric Lippert(常驻CLR向导)

简而言之,Thread.Abort 充其量只能表示糟糕的设计,可能 不可靠,而且极其危险。应该完全避免 费用;唯一一次你甚至应该考虑中止线程 在您尝试的某种“紧急关闭”代码中 尽可能干净地拆除 appdomain。

一些补充阅读

【讨论】:

  • 因此,实际上,线程应该自行到达一个自然停止点,并且任何同步都应该使用您提到的常见策略。基本上ServiceBase.Run(this) 将处理必要的启动/停止代码,这将导致Thread 安全完成,对吧?
  • @willwolfram18 这是一个足够公平的解释
  • 我想我也会把它作为一些额外的阅读材料(你建议的帖子中的一个链接):stackoverflow.com/q/3699147/5884242
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多