jon*_*_ou 18 c# multithreading object-lifetime
假设我有如下代码:
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连接.我很好奇上面代码的生命周期是什么.
提前致谢!
Guf*_*ffa 14
Thread只要不再使用该对象,即在调用该Start方法后立即进行垃圾收集,该对象将有资格进行垃圾收集.(但是不会立即收集,因为垃圾收集器会在特定时间运行.)
然而,实际线程不依赖于Thread对象,并且即使Thread收集对象也将继续运行.
如果在main方法退出时线程仍在运行,则应用程序将不会在线程完成之前结束,除非您已将该线程标记为后台线程.
Vla*_*adV 13
单词"thread"在这里可能意味着几件事:
new Thread()),一旦Start()方法完成,线程对象将成为GC的候选对象,因为没有更多对它的引用.
当doSomeLengthyOperation()运行时,托管线程将保持活动状态.
引用微软MVP的James Kovacs 撰写的文章:
托管线程的生命周期独立于创建它的Thread对象,这是一件非常好的事情,因为您不希望GC仅仅因为丢失了对关联Thread对象的所有引用而终止仍在工作的线程.所以GC正在收集Thread对象,而不是实际的托管线程.
如果您想自己试验,本文还包含一些有用的代码示例.
理论上,操作系统线程与托管线程没有一对一的关系.来自MSDN:
...复杂的主机可以使用CLR Hosting API针对同一操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程.
但实际上,CLR 线程今天直接映射到Windows线程.
Dar*_*rov 10
线程A什么时候被破坏?
当doSomeLengthyOperation完成.
将doSomeLenghtyOperation()能够运行完成
是的,即使主线程存在,因为它不是后台线程.如果在主线程存在时将IsBackground属性设置为true在启动线程之前,则该线程也将停止.
| 归档时间: |
|
| 查看次数: |
8297 次 |
| 最近记录: |