C# 在这种情况下,主线程会发生什么变化

C# 在这种情况下,主线程会发生什么变化,c#,.net,multithreading,C#,.net,Multithreading,我有以下多线程程序: class Program{ static void main(){ (new Thread(DoSomething)).Start(); } static void DoSomething(){ // Dome something here... } } 有几个问题: 主线程是否在脱离子线程后退出 如果它确实退出并且子线程是后台线程:主进程将退出还是等待后台线程完成 主进程线程肯定会退出 编辑:我重新检查了文档,发现默认情况下IsBack

我有以下多线程程序:

class Program{
  static void main(){
    (new Thread(DoSomething)).Start();
  }
  static void DoSomething(){
    // Dome something here...
  }
}
有几个问题:

  • 主线程是否在脱离子线程后退出
  • 如果它确实退出并且子线程是后台线程:主进程将退出还是等待后台线程完成

  • 主进程线程肯定会退出


    编辑:我重新检查了文档,发现默认情况下IsBackground属性为false…这意味着主线程将等待…关于第二个问题的早期响应通常,如果您想等待子线程完成,您需要添加一个
    x.Join()行(其中x是线程的变量),您希望主线程停止并等待子线程完成

    编辑:因此,是的,主线程将退出,除非出现以下三种情况之一: a) 生成的线程在主线程代码的其余部分之前完成(如果添加任何代码)

    b) 您有一个等待线程完成的条件(例如我提到的Join语句,但也有其他方法)

    c) 主线程进入半无限循环(如游戏/图形引擎)

    在您的裸体示例中,它肯定会退出(给定问题的参数,一个背景线程)

    EDIT2:对不起,我似乎回避了你的第二个问题(实际上我一直只考虑背景线程)。如前所述,如果它是后台线程,它将退出,如果它是前台线程,那么它不应该退出(尽管我对前台线程没有太多经验,所以我不能肯定)

    所以要回答您的问题:是的,主线程退出。是的,如果子线程是特定的后台线程,那么进程也将退出

    编辑3:最后编辑,我保证。我只是想添加一些代码,以便您可以自己证明答案(能够这样做总是很好):

    通过切换
    thready.IsBackground=true
    to
    thready.IsBackground=false你得到一个永远运行的程序(直到线程退出才退出)。保持为true将很快退出。

    默认情况下,显式创建的线程是前台线程。前台线程使应用程序在任何一个线程运行期间保持活动状态,而后台线程则不会。所有前台线程完成后,应用程序结束,所有仍在运行的后台线程突然终止

    class PriorityTest
    {
        static void Main (string[] args)
        {
            Thread worker = new Thread ( () => Console.ReadLine() );
            if (args.Length > 0) worker.IsBackground = true;
            worker.Start();
        }
    }
    
    如果在没有任何参数的情况下调用此程序,工作线程将处于前台状态,并将在ReadLine语句中等待用户按Enter键。同时,主线程退出,但应用程序继续运行,因为前台线程仍然处于活动状态

    但是,如果将参数传递给Main(),则工作线程将被指定为后台状态,并且当主线程结束时,程序几乎立即退出(终止读线和程序)。”

    有关更多信息,请参阅线程(这是从中提取的)。

    取决于

    在所有前台线程完成之前,进程将不会退出。在以下示例中

    class Program {
    
        static void Main(string[] args) {
            (new Thread(DoSomething)).Start();
        }
    
        static void DoSomething() {
            Thread.Sleep(5000);
        }
    
    }
    
    class Program {
    
        static void Main(string[] args) {
            (new Thread(DoSomething) { IsBackground = true }).Start();
        }
    
        static void DoSomething() {
            Thread.Sleep(5000);
        }
    
    }
    
    …进程将在5秒后退出

    但在这个例子中

    class Program {
    
        static void Main(string[] args) {
            (new Thread(DoSomething)).Start();
        }
    
        static void DoSomething() {
            Thread.Sleep(5000);
        }
    
    }
    
    class Program {
    
        static void Main(string[] args) {
            (new Thread(DoSomething) { IsBackground = true }).Start();
        }
    
        static void DoSomething() {
            Thread.Sleep(5000);
        }
    
    }
    

    …进程将退出(几乎)立即。对仍在运行的子后台线程的影响类似于强制终止进程,因此如果可能,请避免这样做。

    添加
    控制台。编写
    并查看您自己的问题#2有点多余。您首先询问它是否即将退出,然后询问它是否确实退出:“是否退出”或等一下吗"? 如果它退出,那么它就退出。@jlafay子线程是否为背景线程存在差异:),因此问题是主线程没有差异。它将不考虑退出。主线程可能不考虑退出,但如果线程处于前台,进程将不会立即退出。您可以快速运行我在下面的答案中发布的代码来向自己证明这一点。他在第二个问题中指定了“过程”,而不是“线程”。为什么?它将自动创建为前台线程,这将导致父线程/主线程等待,直到完成其工作。。。