Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#无法连接主线程_C#_.net_Multithreading_Join_Main - Fatal编程技术网

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属性值比较混乱。这也有原因吗?