.NET线程和垃圾回收/虚拟进程

时间:2018-09-21 03:39:36

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

我目前正在尝试确定如何最好地将.NET Core 2.x应用程序作为Windows服务运行,尤其是为消息系统运行NServiceBus端点。我的原始原型是根据Specialicular的Windows Service hosting docs构建的。然后,我拿起了那个可以正常运行的原型,并将其变成了一个供其他团队成员使用的.NET标准库,但是发现对于他们来说,这不是一个超级直观的工具(如果我离开它两个星期,我本人也不是很直观)。

自然地,在我构建了一个可以运行的原型并将其部署到生产环境之后,我发现了一个更为优雅的解决方案,该解决方案使用了{.3}来使用.NET Core的GenericHostBuilder。大部分代码对我来说都是有意义的,但我却挂在new Thread(...).Start();上,可能是因为我没有在C#和.NET中使用Thread的特定经验。

  1. new编写Thread并保持对它的引用是真的不对。我担心这样做可能导致内存泄漏,或者垃圾收集器会捡起来?我确实找到了Mr. Steve Gordon这样的答案,这使我有些放心,即使我不持有对Thread的引用,CLR也会这样做。因此,听起来好像不应该担心GC最终确定线程,对吧?
  2. 有人可以向我解释为什么Abort()不被要求Thread吗?是因为CLR管理线程并知道在主线程关闭时停止其他线程吗?还是与在ServiceBase.Stop()方法中调用IHostLifetime.StopAsync()方法有关?

如果这些内容可以在某个地方的Thread的某些文档中得到解释,那么我很高兴获得“ RTFM”并找到文档。我现在还没有发现任何可以给我清楚解释的东西。

1 个答案:

答案 0 :(得分:5)

当线程执行完成并超出范围时,垃圾收集器最终将回收资源(如果有需要的话)。 Thread并没有实现IDisposable,因此您真的不需要费心地徘徊(除非您正在其中执行无穷循环)

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

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

  

简而言之,Thread.Abort最多表示不良设计,可能是   不可靠,极其危险。应该完全避免   费用;唯一一次您甚至应该考虑中止线程   在您尝试的某种“紧急关机”代码中   尽可能干净地拆除应用程序域。

一些其他读物