2017-03-14 3 views
2

免責事項1:私はマルチスレッドのコンセプトを理解していますが、正しい実装はまだ私を逃しています。スレッドはまだ実行中ですか、それともLINQPadですか?

免責事項2: LINQPadを批判しているわけではありません。驚くべきことです。私は何かが欠落しているかどうかを調べようとしているだけです。

Console.WriteLine("Completed");が呼び出されたときに、スレッドがまだ実行されていますか?

私はLINQPadで実行したときに、私は右下隅にあるすべてのスレッドをキャンセルするCtrlキーを押しながら+ Shiftキー+ F5を参照してくださいので、私は、私はVSを通じてコン​​ソールアプリケーションと同じコードを実行すると、それはそう、しかし、頼みます終了します。タスクを正しく使用していない、または正しく終了していない可能性があります。あなたは、Visual Studioでビルドする通常の実行ファイルとは異なり

public class TaskRunner 
{ 
    public async void RunTasks() 
    { 
     CancellationTokenSource cts = new CancellationTokenSource(); 
     CancellationToken ct = cts.Token; 

     Task loadingTask = 
      new Task(() => 
       { 
        //do something that takes a while, ie. database or service call 
        for (int i = 0; i < 10; i++) 
        { 
         Thread.Sleep(100); 
         Console.WriteLine("Loading"); 
        } 
       }); 

     Task entertainmentTask = 
      new Task(() => 
       { 
        //do something until told to stop to keep user entertained 
        while (true) 
        { 
         if (ct.IsCancellationRequested) 
         { 
          break; 
         } 
         Console.WriteLine("Entertainment"); 
         Thread.Sleep(50); 
        } 
       }, ct); 

     loadingTask.Start(); 
     entertainmentTask.Start(); 

     await Task.WhenAny(loadingTask, entertainmentTask); 
     cts.Cancel(); 

     Console.WriteLine("Completed"); 
    } 
} 

答えて

1

メインスレッドが完了し、これはバックグラウンドスレッドを実行し続けることを意味した後、LINQPadは生きているプロセスやアプリケーションを保持します。

さらに、LINQPadは、クエリを再実行するときに同じプロセス/ AppDomainをリサイクルします。これはパフォーマンスの最適化であり、LINQPadのUtil.Cacheメソッドを使用してクエリ実行間でデータをキャッシュすることもできます。たとえば、次のようになります。

void Main() 
{ 
    Util.Cache (TakesSomeTime).Dump(); 
} 

int TakesSomeTime() 
{ 
    Thread.Sleep(2000); 
    return 42; 
} 

初めてこのクエリを実行すると、2秒かかります。その後の実行は瞬間的です。

+0

私はそれを別の言葉で言いたいと思います。 Console.WriteLine( "Completed")がヒットした場合、プログラムは従来の実行可能ファイルで実行されますが、LINQPadは将来スレッドを最適化するためにスレッドを有効に保ちます。 –

+0

これは正しいです。従来の実行可能ファイルでは、すべてのフォアグラウンドスレッドが完了すると、すべてのバックグラウンドスレッドが終了します。メインスレッドはフォアグラウンドスレッドであり、タスクは別途指示がない限りバックグラウンドスレッドを使用します。 –

関連する問題