C# .NET线程和垃圾收集/虚拟进程
我目前正在研究如何最好地将.NET Core 2.x应用程序作为Windows服务运行,特别是为消息传递系统运行NServiceBus端点。我最初的原型是从一些特定的。然后,我将该功能原型转换成一个.NET标准库,供其他团队成员使用,但发现对他们(或者我自己,如果我离开它两周的话)来说,这并不是超级直观的 很自然,在我构建了一个功能正常的原型并将其部署到生产环境中之后,我发现了一个更优雅的解决方案,它使用了.NET Core的C# .NET线程和垃圾收集/虚拟进程,c#,multithreading,.net-core,windows-services,nservicebus,C#,Multithreading,.net Core,Windows Services,Nservicebus,我目前正在研究如何最好地将.NET Core 2.x应用程序作为Windows服务运行,特别是为消息传递系统运行NServiceBus端点。我最初的原型是从一些特定的。然后,我将该功能原型转换成一个.NET标准库,供其他团队成员使用,但发现对他们(或者我自己,如果我离开它两周的话)来说,这并不是超级直观的 很自然,在我构建了一个功能正常的原型并将其部署到生产环境中之后,我发现了一个更优雅的解决方案,它使用了.NET Core的GenericHostBuilder,这是由一个。大多数代码对我来说都
GenericHostBuilder
,这是由一个。大多数代码对我来说都是有意义的,但是我被新线程(…).Start()挂起了代码>,可能是因为我没有在C#和.NET中使用线程的任何具体经验
new
创建一个线程
并且不维护对它的引用,这感觉非常错误。我担心这样做可能会导致内存泄漏,或者垃圾收集器会把它捡起来?我确实找到了这样的答案,这给了我一些信心,即使我没有引用线程
,CLR也会。所以听起来GC终结线程不应该有任何顾虑,对吧
有人能给我解释一下为什么线程
没有调用Abort()
?是否因为CLR管理线程,并且知道在主线程关闭时停止其他线程?或者它是否与调用IHostLifetime.StopAsync()
方法中的ServiceBase.Stop()
方法有关
如果这些事情可以在Thread
的一些文档中得到解释,我非常乐意得到一个“RTFM”并找到文档。目前我还没有找到任何能给我一个清晰解释的东西。当线程执行完成并超出范围时,垃圾收集器最终会回收资源(如果需要的话)<代码>线程
也没有实现IDisposable
,所以你真的不需要为它的存在而烦恼(除非你在它里面执行无休止的循环)
关于Thread.Abort
vsThread.Interrupt
,我诚实的回答是,您永远不应该使用这两种方法中的任何一种来终止线程。建议不要使用Thread.Abort
或Thread.Interrupt
方法-您应该利用同步对象(如WaitHandles或信号量,ect,ect,ect),并对正在使用的线程执行优雅的终止
wise(常驻CLR向导)
简而言之,Thread.Abort
充其量只能说明设计不好,可能是
不可靠,而且非常危险。这完全应该避免
成本;你唯一应该考虑中止一个线程的时间
处于某种“紧急关闭”代码中
尽可能干净地拆除appdomain
一些额外的阅读
因此,有效地说,线程本身应该达到一个自然停止点,任何同步都应该使用您提到的常用策略。基本上,ServiceBase.Run(this)
将处理必要的启动/停止代码,这将导致线程
安全地完成,对吗?@willwolfram18这是一个足够公平的解释,我想把它作为一些额外的阅读(你建议的帖子中的链接):正确编写多线程C#程序非常困难,甚至连最基本的知识都不懂。找个专家帮你。你会弄错,更糟糕的是,它会以微妙的方式出错,这种错误不会在测试中出现,而是在生产中出现。我向你保证,我知道多线程编程的基础知识,并且理解多线程程序可能导致难以检测的错误(我写了一些多线程的东西,我自己也看到了这一点)。不过你是对的,我还没有使用C#进行多线程处理。更好的是,与其告诉我“找个专家”,不如让我读一些文档或材料,这样我就可以学习和发展自己了?也许我没有C#多线程技术的“专家”?要求提供非现场教程显然与本网站无关。简言之,C中的线程章节非常好。我是最近一期的编辑。