2012-03-04 27 views
3

什么,我有以下的多线程程序:发生在主线程在这种情况下

class Program{ 
    static void main(){ 
    (new Thread(DoSomething)).Start(); 
    } 
    static void DoSomething(){ 
    // Dome something here... 
    } 
} 

几个问题:

  1. 是否分拆的子线程后,主线程退出?
  2. 如果它退出并且子线程是后台线程:主进程是退出还是等待后台线程完成?
+1

添加'Console.Write'并亲自查看 – 2012-03-04 15:13:42

+0

问题#2有点多余。你首先询问它是否会退出,然后询问是否退出:“退出”还是“等待”?那么如果它退出,那么它就退出了。 – jlafay 2012-03-04 15:20:51

+0

@jlafay子线程是否是后台线程是有区别的:)因此问题 – GETah 2012-03-04 15:22:47

回答

6

通常,如果您想等待子线程完成,那么您需要添加一个x.Join();行(其中x是您的线程的变量),无论您希望主线程停止并等待孩子完成。

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

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

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

在您的裸机示例中,它肯定会退出(给出您的问题参数,后台线程)。编辑2:对不起,我似乎躲过了你的第二个问题(实际上只考虑整个背景线程)。如果它是一个后台线程,它会按照我的解释退出,如果它是前台,那么它不应该(尽管我对前台线程没有太多经验,所以我不能肯定地说)。

所以要回答你的问题:是的,主线程退出。是的,如果孩子特别是后台线程,该过程也将退出。

编辑3:最终编辑,我保证。我只是想添加一些代码,让你可以证明自己的答案(这总是很高兴能够做到):

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

static void DoSomething() 
{ 
    while (true) 
    { 
     Console.Write("thread's looping \n"); 
    } 
} 

通过翻转thready.IsBackground = true;thready.IsBackground = false;你一直运行的程序(未退出直到线程)。将它保留为true将很快退出。 “

1

主要处理线程肯定会退出...

编辑:我复查的文档,发现财产的IsBackground默认情况下...这意味着主线程将等待是假的......较早响应ws关于第二个问题

+0

为什么?它将被自动创建为前台线程,这将最终导致父/主线程等待其完成工作。 – MoonKnight 2012-03-04 15:34:22

5

”默认情况下,显式创建的线程是前景线程。前景线程只要其中任何一个正在运行就保持活动状态,而后台线程不会。任何后台线程仍在运行的突然终止。

class PriorityTest 
{ 
    static void Main (string[] args) 
    { 
     Thread worker = new Thread (() => Console.ReadLine()); 
     if (args.Length > 0) worker.IsBackground = true; 
     worker.Start(); 
    } 
} 

如果该计划被称为不带任何参数,工作线程将采取前台状态,而会等待readline的语句将用户按Enter键。同时,主线程退出,但应用程序继续运行,因为前台线程仍处于活动状态。

然而,如果参数被传递给主()时,工人被分配背景状态,并且该程序几乎立即退出主线程结束(终止的ReadLine和程序)。”

参见Joseph Albahri's (a genius and great guy) page关于线程的更多信息(这是这个地方从提取)。

5

取决于Thread.IsBackground

过程中不会退出之前的所有前台线程结束。在下面的例子...

class Program { 

    static void Main(string[] args) { 
     (new Thread(DoSomething)).Start(); 
    } 

    static void DoSomething() { 
     Thread.Sleep(5000); 
    } 

} 

...该过程将在5秒后退出。

但在这个例子中...

class Program { 

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

    static void DoSomething() { 
     Thread.Sleep(5000); 
    } 

} 

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

相关问题