2017-03-27 11 views
0

私はタスクとスレッドに精通していて、私はすでにthisを知っています。ここでタスクの生涯子と親

は私のコードです:

static void Main(string[] args) 
{ 
    var t = Task.Factory.StartNew(() => { 

     Thread.Sleep(3000); 
     Console.WriteLine("Child"); 

    }, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.Default); 

    Task.WaitAll(t); 
    Console.WriteLine("Parent"); 
} 

Console.WriteLine("Child");は、言い換えればTask.WaitAll(t);の呼び出しregardelss呼び出されるん:ALLを実行するためにそこの方法は、彼ら(とではないが、すぐ親として殺さwaitingせずにサブタスクを開始されています実行を終了する)?

答えて

2

C#プログラムは、フォアグラウンド・スレッドが実行されなくなるとすぐに終了します。 Task.Factory.StartNewはスレッドプールスレッドを使用して作業を行い、スレッドプールスレッドはすべてフォアグラウンドスレッドではなくバックグラウンドスレッドであり、プログラム全体の終了を妨げるものではありません。

プログラム全体が終了しないようにするには、少なくとも1つのフォアグラウンドスレッドが実行されていることを確認する必要があります。これは、作成したTaskの追加作業をバックグラウンドスレッドではなくフォアグラウンドスレッド(アプリケーションが終了しないようにしたい場合は適切です)、または既存のフォアグラウンドスレッドで他のスレッドが終了するのを待つことを意味します。

+0

スレッドを使用して 'thread.IsBackground = false;'を設定するとどうなりますか? – Emaborsa

+0

@Emaborsaスレッドプールスレッドの場合は絶対に行うべきではありません。これは特に、バックグラウンドスレッドを持つことを想定して設計されているため、混乱させるべきではありません。それは問題を引き起こす可能性が非常に高いです。独自の新しいスレッドを作成している場合は、デフォルトでフォアグラウンドスレッドになります。 – Servy

関連する問題