2016-12-12 13 views
1

別のスレッドで作成されたタスクを待つことはできますか?たとえば、次のように2つの異なるスレッドで1つのタスクを待つ方法は?

... 
CurrentIteration = Execute(); // returns Task 
await CurrentIteration; 
... 

そして、別のスレッドで:

... 
await CurrentIteration; 
... 

1)メソッドの第二のスレッドの待機が実行を完了するために実行されますか? 2)場合、私が最初のスレッドで

CurrentIteration = Execute(); // returns Task 
await CurrentIteration; 

を再実行することを考えると、第二のスレッドで同じ目的のためにCurrentIterationを再利用することができるようになりますでしょうか?

私は疲れてこのコード:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     MainAsync(args).GetAwaiter().GetResult(); 
    } 
    public static async Task MainAsync(string[] args) 
    { 

     var instance = new SomeClass(); 
     var task = instance.Execute(); 
     Console.WriteLine("thread 1 waiting..."); 
     Task.Run(async() => 
     { 
      Console.WriteLine("thread 2 started... waiting..."); 
      await task; 
      Console.WriteLine("thread 2 ended!!!!!"); 
     }); 

     await task; 

     Console.WriteLine("thread 1 done!!"); 

     Console.ReadKey(); 
    } 
} 


public class SomeClass 
{ 
    public async Task Execute() 
    { 
     await Task.Delay(4000); 
    } 
} 

しかし、それは

thread 1 waiting... 
thread 2 started... waiting... 

その後、

thread 1 done!! 

決してthread 2 ended!!!!!を印刷します。何故ですか?それをどうすれば実現できますか?ありがとう!

+2

開始するタスクを待っていません。実際には、インテリセンスであなたに警告する必要があります。あなたがそれを待たずに 'thread 1 done'の前に実行されることもあります。 – Rob

+0

あなたは 'Task.Run ...'の前に 'await'を置くべきですか? – nicks

+0

それは正しい、はい – Rob

答えて

3

await複数のスレッドからタスクを実行できます。 @ Robが言ったように、あなたはちょうどawaitの2番目のスレッドに必要だったので、実際には動作するようには本当に近いです。

public static async Task MainAsync(string[] args) 
    { 

     var instance = new SomeClass(); 
     var task = instance.Execute(); 
     Console.WriteLine("thread 1 waiting..."); 
     var secondTask = Task.Run(async() => 
     { 
      Console.WriteLine("thread 2 started... waiting..."); 
      await task; 
      Console.WriteLine("thread 2 ended!!!!!"); 
     }); 

     await task; 

     await secondTask; 

     Console.WriteLine("thread 1 done!!"); 

     Console.ReadKey(); 
    } 

タスクを待って終了した後、2番目のスレッドで待機を追加します。

は、この検討してください。

表示されなかった理由は、コンソールがReadKeyメソッドで停止し、終了するまで何も書き込めなかったためです。 Enterを押すと、「スレッド2が終了しました!!!!!」というメッセージが表示されます。アプリが閉じる前に1秒間待ってください。

関連する問題