.NET Threads和Garbage Collection/Phantom进程

wil*_*m18 2 c# multithreading windows-services nservicebus .net-core

我目前正在尝试研究如何最好地将.NET Core 2.x应用程序作为Windows服务运行,特别是为邮件系统运行NServiceBus端点.我的原始原型是从特定的一些Windows Service托管文档构建的.然后我把这个功能正常的原型变成了一个.NET标准库供其他团队成员构建,但发现它对他们来说并不是非常直观(或者我自己离开它2周).

当然,在我构建了一个正常运行的原型并将其部署到生产中之后,我找到了一个更优雅的解决方案,使用.NET Core GenericHostBuilder,由Steve Gordon先生提供.大多数代码对我来说都很有意义,但是我很喜欢new Thread(...).Start();,可能是因为我没有Thread在C#和.NET中使用任何特定经验.

  1. new荷兰国际集团了Thread和维护没有提及那感觉真的错了.我担心这样做会导致内存泄漏或垃圾收集器会捡起它?我确实找到了这个答案,这让我有些保证,即使我没有提及Thread,CLR也会.所以听起来GC应该没有任何关注最终确定线程,对吗?
  2. 任何人都可以向我解释为什么Abort()没有被要求Thread?是因为CLR管理线程并且知道在主线程关闭时停止其他线程吗?或者它是否与调用ServiceBase.Stop()方法中的IHostLifetime.StopAsync()方法有关?

如果这些东西可以在Thread某个地方的某些文档中解释,我很高兴得到一个"RTFM"并找到文档.在这一点上,我还没有找到任何给我一个明确解释的东西.

AAA*_*ddd 5

当线程执行完成并且超出范围时,垃圾收集器最终将回收资源(如果感觉需要的话).Thread也没有实现IDisposable所以你真的不需要打扰你的自己(除非你在其中执行无限循环)

关于Thread.Abortvs Thread.Interrupt,我诚实的回答是你永远不应该使用这些方法中的任何一种来终止线程.建议不要使用Thread.AbortThread.Interrupt方法 - 您应该利用同步对象(如WaitHandles或Semaphores,ect,ect等)并执行正在使用的线程的正常终止.

用Eric Lippert(常驻CLR向导)的明智之

简而言之,Thread.Abort至多表明设计不良,可能不可靠,而且非常危险.应该不惜一切代价避免; 你应该考虑中止线程的唯一一次是某种"紧急关闭"代码,你试图尽可能干净地拆除appdomain.

一些额外的阅读