C# .NET线程和垃圾收集/虚拟进程

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,这是由一个。大多数代码对我来说都

我目前正在研究如何最好地将.NET Core 2.x应用程序作为Windows服务运行,特别是为消息传递系统运行NServiceBus端点。我最初的原型是从一些特定的。然后,我将该功能原型转换成一个.NET标准库,供其他团队成员使用,但发现对他们(或者我自己,如果我离开它两周的话)来说,这并不是超级直观的

很自然,在我构建了一个功能正常的原型并将其部署到生产环境中之后,我发现了一个更优雅的解决方案,它使用了.NET Core的
GenericHostBuilder
,这是由一个。大多数代码对我来说都是有意义的,但是我被
新线程(…).Start()挂起了,可能是因为我没有在C#和.NET中使用
线程的任何具体经验

  • new
    创建一个
    线程
    并且不维护对它的引用,这感觉非常错误。我担心这样做可能会导致内存泄漏,或者垃圾收集器会把它捡起来?我确实找到了这样的答案,这给了我一些信心,即使我没有引用
    线程
    ,CLR也会。所以听起来GC终结线程不应该有任何顾虑,对吧
  • 有人能给我解释一下为什么
    线程
    没有调用
    Abort()
    ?是否因为CLR管理线程,并且知道在主线程关闭时停止其他线程?或者它是否与调用
    IHostLifetime.StopAsync()
    方法中的
    ServiceBase.Stop()
    方法有关

  • 如果这些事情可以在
    Thread
    的一些文档中得到解释,我非常乐意得到一个“RTFM”并找到文档。目前我还没有找到任何能给我一个清晰解释的东西。

    当线程执行完成并超出范围时,垃圾收集器最终会回收资源(如果需要的话)<代码>线程
    也没有实现
    IDisposable
    ,所以你真的不需要为它的存在而烦恼(除非你在它里面执行无休止的循环)

    关于
    Thread.Abort
    vs
    Thread.Interrupt
    ,我诚实的回答是,您永远不应该使用这两种方法中的任何一种来终止线程。建议不要使用
    Thread.Abort
    Thread.Interrupt
    方法-您应该利用同步对象(如WaitHandles或信号量,ect,ect,ect),并对正在使用的线程执行优雅的终止

    wise(常驻CLR向导)

    简而言之,
    Thread.Abort
    充其量只能说明设计不好,可能是 不可靠,而且非常危险。这完全应该避免 成本;你唯一应该考虑中止一个线程的时间 处于某种“紧急关闭”代码中 尽可能干净地拆除appdomain

    一些额外的阅读


    因此,有效地说,线程本身应该达到一个自然停止点,任何同步都应该使用您提到的常用策略。基本上,
    ServiceBase.Run(this)
    将处理必要的启动/停止代码,这将导致
    线程
    安全地完成,对吗?@willwolfram18这是一个足够公平的解释,我想把它作为一些额外的阅读(你建议的帖子中的链接):正确编写多线程C#程序非常困难,甚至连最基本的知识都不懂。找个专家帮你。你会弄错,更糟糕的是,它会以微妙的方式出错,这种错误不会在测试中出现,而是在生产中出现。我向你保证,我知道多线程编程的基础知识,并且理解多线程程序可能导致难以检测的错误(我写了一些多线程的东西,我自己也看到了这一点)。不过你是对的,我还没有使用C#进行多线程处理。更好的是,与其告诉我“找个专家”,不如让我读一些文档或材料,这样我就可以学习和发展自己了?也许我没有C#多线程技术的“专家”?要求提供非现场教程显然与本网站无关。简言之,C中的线程章节非常好。我是最近一期的编辑。