C#无法连接主线程
我有非常简单的代码,我无法理解这些行为C#无法连接主线程,c#,.net,multithreading,join,main,C#,.net,Multithreading,Join,Main,我有非常简单的代码,我无法理解这些行为 class Program { static void Main(string[] args) { // Get reference to main thread Thread mainThread = Thread.CurrentThread; // Start second thread new Thread(() => {
class Program
{
static void Main(string[] args)
{
// Get reference to main thread
Thread mainThread = Thread.CurrentThread;
// Start second thread
new Thread(() =>
{
Console.WriteLine("Working...");
Thread.Sleep(1000);
Console.WriteLine("Work finished. Waiting for main thread to end...");
mainThread.Join(); // Obviously this join cannot pass
Console.WriteLine("This message never prints. Why???");
}).Start();
Thread.Sleep(300);
Console.WriteLine("Main thread ended");
}
}
这个永无止境的程序的输出是:
Working...
Main thread ended
Work finished. Waiting for main thread to end...
工作
主线程结束
工作完成了。正在等待主线程结束。。。
为什么线程的代码卡在Join()方法调用上?通过其他打印输出可以发现,在调用Join()
之前,mainThread
的属性IsAlive
设置为false,ThreadState
为Background,Stopped,WaitSleepJoin
。此外,消除睡眠也没有任何区别
这种行为的原因是什么?Join()
方法和执行Main
方法的神秘之处是什么?Join()
的工作原理与您预期的一样,这里的问题在于假设运行Main()
的线程在Main()
返回时终止,但情况并非总是如此
.NET framework会调用您的Main()
方法,当该方法返回时,框架会在主线程(以及进程)退出之前执行其他代码。具体来说,框架作为post主代码的一部分所做的一件事就是等待所有前台线程退出
这本质上导致了一种典型的死锁情况——主线程正在等待工作线程退出,而工作线程正在等待主线程退出
当然,如果您将工作线程设置为后台线程(通过在启动它之前设置IsBackground=true
),那么post主代码将不会等待它退出,从而消除死锁。但是,您的Join()
仍然不会返回,因为当主线程退出时,进程也会退出
有关在Main()
之前和之后运行的框架内部构件的更多详细信息,您可以查看GitHub上的.NET核心代码库。运行Main()
的总体方法是,在Main()
返回后运行的代码是。主线程终止通常与进程终止一致。我猜这是在对你的代码做一些你不想做的事情是的,这比我的答案要好+1用于链接源。我正要自己做那件事。这是很好的解释。我也非常高兴的源代码链接,支持该声明。我不知道在哪里可以找到这段代码,只是mainThread状态和isAlive属性值比较混乱。这也有原因吗?