2012-03-04 6 views
3

でメインスレッドに何が起こる私は、次のマルチスレッドのプログラムを持っている:この場合

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

質問のカップル:

  1. は子スレッドをスピンオフした後、メインスレッドの終了していますか?
  2. 終了し、子スレッドがバックグラウンドスレッドである場合:メインプロセスが終了するか、バックグラウンドスレッドが終了するのを待ちますか?
+1

'Console.Write'を追加して自分自身を参照してください –

+0

質問#2は少し冗長です。あなたはまずそれが終了するかどうか尋ね、それから終了するかどうかを尋ねる:「それは終了する」か「それは待つか」?さて、それが終了すると、それは終了します。 – jlafay

+0

@jlafay子スレッドがバックグラウンドスレッドであるかどうかには違いがあるため:) – GETah

答えて

6

通常、子スレッドが完了するのを待つ場合は、メインスレッドを停止させたい場合は、x.Join();行(xはスレッドの変数)を追加します子供が完成するのを待つ。

EDIT:3例1が発生しない限り、そう、メインスレッドが終了します: a)に生成されたスレッドは、メインスレッドのコードの残りの部分が完了する前に、あなたがいずれかを追加した場合)(

b)にあなたスレッドが完了するのを待つ条件(私が言及したJoinステートメントなど、他の方法もあります)があります。

c)メインスレッドは半無限ループ(ゲーム/グラフィックスエンジンなど)に入ります。

あなたのベアボーンの例では、(あなたの質問のパラメータ、バックグラウンドスレッドを仮定して)確実に終了します。

EDIT2:申し訳ありませんが、私はあなたの2番目の質問を避けているようです(実際には、全体的にバックグラウンドスレッドとみなされていました)。バックグラウンドスレッドであれば、私が説明したように終了します。フォアグラウンドなら、それはすべきではありません(フォアグラウンドスレッドの経験はあまりないので、私は確かに言えません)。

質問に答えてください:はい、メインスレッドが終了します。はい、子が特にバックグラウンドスレッドの場合、プロセスも終了します。

EDIT3:最終編集でお約束します。 (出ない

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 = false;からthready.IsBackground = true;あなたは永遠に実行するプログラムを取得するトグルで:私はちょうどあなたが(行うことができるように、常にいいです)答えを自分で証明することができるようにいくつかのコードを追加したいですスレッドが行うまで)。それを真のままにしておくと、非常に迅速に終了します。

1

メインプロセススレッドは間違いなく...

編集を終了します:私は、ドキュメントを再チェックし、IsBackgroundプロパティがデフォルト...メインスレッドが待機する意味で虚偽であることが判明し...早く応答をws 2番目の質問に関して

+0

なぜですか?フォアグラウンドスレッドとして自動的に作成されます。これは、親/メインスレッドがその作業を完了するまで待つことになるでしょう... – MoonKnight

5

"既定では、明示的に作成するスレッドはフォアグラウンドスレッドです。フォアグラウンドスレッドは、いずれか1つが実行されている間はアプリケーションを有効に保ちますが、バックグラウンドスレッドは実行しません。それでも突然実行されている任意のバックグラウンドスレッドが終了します。

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

をこのプログラムは、引数なしで呼び出された場合、ワーカースレッドがフォアグラウンド状態がかかりますし、ユーザーがEnterキーを押すためReadLineのステートメントに待機します。同時に、メインスレッドは終了しますが、フォアグラウンドスレッドがまだ生きているため、アプリケーションは実行を継続します。引数がメイン()に渡される場合

しかし、労働者は、バックグラウンドの状態が割り当てられ、プログラムは、メインスレッドが終了する(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); 
    } 

} 

...プロセスは、すぐに(ほぼ)終了します。実行中の子バックグラウンドスレッドへの影響は、強制的にプロセスを強制終了するのと似ています。可能であれば、その処理を行わないでください。

関連する問題