假设我有如下代码:
int Main()
{
if (true)
{
new Thread(()=>
{
doSomeLengthyOperation();
}).Start();
}
while (true)
{
//do nothing
}
}
Run Code Online (Sandbox Code Playgroud)
有2个线程,我会打电话给主线程正在执行main()函数的线程,该线程被new'ed了里面的"如果"测试为主题A.
我的问题是,线程A什么时候被销毁?do doSomeLenghtyOperation()能够完成吗?
由于没有指向线程A的引用,它是否会被标记为垃圾收集的候选者:
我看到的所有示例都是Main()持有引用,然后主线程在退出之前等待与线程A连接.我很好奇上面代码的生命周期是什么.
提前致谢!
我正在使用TPL和async/await进行一些测试,并注意到我发现意外的事情:我正在安排使用lambdas和Task.Run运行的工作,例如:
Task.Run(()=>Console.WriteLine("Nice program"));
Run Code Online (Sandbox Code Playgroud)
然后我意识到,如果程序立即返回,则工作永远不会执行.这是任何.NET应用程序(WPF,Forms等)中的预期行为吗?有没有讨论这个的文件?
这意味着Task.Run实际上是一个禁止发生火灾的场景.
我目前正在尝试研究如何最好地将.NET Core 2.x应用程序作为Windows服务运行,特别是为邮件系统运行NServiceBus端点.我的原始原型是从特定的一些Windows Service托管文档构建的.然后我把这个功能正常的原型变成了一个.NET标准库供其他团队成员构建,但发现它对他们来说并不是非常直观(或者我自己离开它2周).
当然,在我构建了一个正常运行的原型并将其部署到生产中之后,我找到了一个更优雅的解决方案,使用.NET Core GenericHostBuilder,由Steve Gordon先生提供.大多数代码对我来说都很有意义,但是我很喜欢new Thread(...).Start();,可能是因为我没有Thread在C#和.NET中使用任何特定经验.
new荷兰国际集团了Thread和维护没有提及那感觉真的错了.我担心这样做会导致内存泄漏或垃圾收集器会捡起它?我确实找到了这个答案,这让我有些保证,即使我没有提及Thread,CLR也会.所以听起来GC应该没有任何关注最终确定线程,对吗?Abort()没有被要求Thread?是因为CLR管理线程并且知道在主线程关闭时停止其他线程吗?或者它是否与调用ServiceBase.Stop()方法中的IHostLifetime.StopAsync()方法有关?如果这些东西可以在Thread某个地方的某些文档中解释,我很高兴得到一个"RTFM"并找到文档.在这一点上,我还没有找到任何给我一个明确解释的东西.