我目前正在尝试确定如何最好地将.NET Core 2.x应用程序作为Windows服务运行,尤其是为消息系统运行NServiceBus端点。我的原始原型是根据Specialicular的Windows Service hosting docs构建的。然后,我拿起了那个可以正常运行的原型,并将其变成了一个供其他团队成员使用的.NET标准库,但是发现对于他们来说,这不是一个超级直观的工具(如果我离开它两个星期,我本人也不是很直观)。>
自然地,在我构建了一个可以运行的原型并将其部署到生产环境之后,我发现了一个更为优雅的解决方案,该解决方案使用了{.3}来使用.NET Core的GenericHostBuilder
。大部分代码对我来说都是有意义的,但我却挂在new Thread(...).Start();
上,可能是因为我没有在C#和.NET中使用Thread
的特定经验。
new
编写Thread
并保持对它的引用是真的不对。我担心这样做可能导致内存泄漏,或者垃圾收集器会捡起来?我确实找到了Mr. Steve Gordon这样的答案,这使我有些放心,即使我不持有对Thread
的引用,CLR也会这样做。因此,听起来好像不应该担心GC最终确定线程,对吧?Abort()
不被要求Thread
吗?是因为CLR管理线程并知道在主线程关闭时停止其他线程吗?还是与在ServiceBase.Stop()
方法中调用IHostLifetime.StopAsync()
方法有关?如果这些内容可以在某个地方的Thread
的某些文档中得到解释,那么我很高兴获得“ RTFM”并找到文档。我现在还没有发现任何可以给我清楚解释的东西。
答案 0 :(得分:5)
当线程执行完成并超出范围时,垃圾收集器最终将回收资源(如果有需要的话)。 Thread
并没有实现IDisposable
,因此您真的不需要费心地徘徊(除非您正在其中执行无穷循环)
关于Thread.Abort
和Thread.Interrupt
,我的诚实回答是,您永远不要使用这两种方法来终止线程。建议完全不要使用Thread.Abort
或Thread.Interrupt
方法-您应该充分利用同步对象(如WaitHandles或Semaphores,ect,ect,ect)并执行线程的正常终止您正在使用。
明智的words of Eric Lippert(常驻CLR向导)
简而言之,
Thread.Abort
最多表示不良设计,可能是 不可靠,极其危险。应该完全避免 费用;唯一一次您甚至应该考虑中止线程 在您尝试的某种“紧急关机”代码中 尽可能干净地拆除应用程序域。
一些其他读物