还是可以做这样的事情:

new Thread( new ThreadStart( delegate { DoSomething(); } ) ).Start();



我似乎记得在这种情况下,将对Thread对象进行垃圾回收,但是底层的OS线程将继续运行,直到将委托(delegate)的末尾传递给它为止。我基本上是在寻找ThreadPool功能,但不希望这些线程成为后台线程(即,我希望它们使应用程序保持事件状态)。

更新:
根据Jason的说法,CLR在运行时实际上保留了对Thread对象的内部引用,因此在线程退出之前不会进行垃圾回收。

最佳答案

我通常发现,如果我需要按照示例中的方式直接启动一个新线程,而不是从线程池中获取一个线程,那么它是一个运行时间长的线程,以后我需要引用它来杀死它,监视它等。对于短期线程(例如在后台线程上调用IO等),我总是使用线程池线程(通常通过someDelete.BeginBlah(...)方法调用间接地)。当使用这样的线程池线程时,我宁愿不要保持引用。我不知道其他程序员是否会不本地使用对该线程的引用。如果我不需要引用,也不会保留代码以使代码困惑。

编辑:要回答有关正在垃圾回收的线程的编辑,在线程运行时不会发生这种情况。 CLR保留对每个正在运行的线程的引用。代表线程的对象将不会被收集。

关于c# - 是否应该始终在C#中保留对正在运行的Thread对象的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/390753/

10-11 23:18
查看更多