2016-07-07 18 views
2

私はコンソールアプリケーションを持っていて、次々にタスクを起動したいと思います。ここでTask.Wait()はタスクの完了を待っていません

は私のコードです:

static void Main() 
{ 
    string keywords = "Driving Schools,wedding services"; 
    List<string> kwl = keywords.Split(',').ToList(); 

    foreach(var kw in kwl) 
    { 
     Output("SEARCHING FOR: " + kw); 
     Task t = new Task(() => Search(kw)); 
     t.Start(); 
     t.Wait(); 
    } 

    Console.ReadLine(); 
} 

static async void Search(string keyword) 
{ 
    // code for searching 
} 

問題は、それが実行を終了する最初のタスクを待たないということです。後続のタスクを同時に起動します。

私はレートリミテッドAPIを使用しているので、私は次々にやりたいと思います。

なぜ次の検索を開始する前に1回の検索が終了するのを待っていないのですか?

+0

検索方法は、いくつかのメソッドを使用していますそれらは非同期的に呼び出されなければならず、最初は普通に呼び出す際にエラーが発生しましたので、この方法で試してみました。 – Guerrilla

+0

また、この動作が完璧で、あなたが待っていることを理解しています。タスクが非同期メソッドをラップすると、 'await'が返され、' Task Wait'が実行されるので、文句を言うことはできません –

答えて

10

あなたのasyncメソッドはちょうどvoidを返します。つまり、完了するのを待っている簡単な方法はありません。 (ほとんどの場合、async voidのメソッドは使用しないでください。実際にはイベントを購読するためにのみ使用できます)。あなたのタスクはSearchを呼び出すだけで、完了するまで待っています。それはかなりすぐになるでしょう。

あなたがすべてで非同期を使用している理由は、あなたが実際にシリアルに物事を行いたい場合はそれは明確ではないですが、私はもっとこのように見えるようにコードを変更することをお勧めしたい:

static void Main() 
{ 
    // No risk of deadlock, as a console app doesn't have a synchronization context 
    RunSearches().Wait(); 
    Console.ReadLine(); 
} 

static async Task RunSearches() 
{ 
    string keywords = "Driving Schools,wedding services"; 
    List<string> kwl = keywords.Split(',').ToList(); 

    foreach(var kw in kwl) 
    { 
     Output("SEARCHING FOR: " + kw); 
     await Search(kw); 
    }    
} 

static async Task Search(string keyword) 
{ 
    // code for searching 
} 
+0

さらに、プロセスは非同期の動作ではありません。 –

+0

ありがとう!検索機能はいくつかの非同期関数を使用しており、メインメソッドからすべてを開始する方法を少し混乱させています。あなたの提案したコードを更新しました。多くのありがとうMr. Skeet。 – Guerrilla

+0

Non Consoleアプリケーションの@Jon Skeetこれは 'Task'WhenAll'を使って' synchronized'コンテキストをマップし、 'deadlock'を避けますか? –