2016-12-02 49 views
0

私の結果に基づいていくつかの奇妙な動作が見られているので、これを正しく取得したいだけです。C# - Await and async

次のように私は、非同期メソッドを定義している:

public async Task<System.Net.HttpStatusCode> GetJson(Stream inputJson) 
{ 
    ...... 
    ..... 
    ... 
    var query1 = from xxx in new xxx() 
       where xxx.id == myID 
       select xxx; 
    var results1 = await query1.FindAsync(); 

    var query2 = from yyy in new yyy() 
       where yyy.id == myID 
       select yyy; 
    var results2 = await query2.FindAsync(); 
    ... 
    .... 
    ..... 
    return System.Net.HttpStatusCode.OK; 
} 

query2のみquery1終了実行後に実行するのでしょうか?または並行してですか?

+2

'query2'の後に' query2'が実行され、結果が返されます。 – ThePerplexedOne

+0

@Polis:良い精神的なショートカットは: 'await'は"非同期待機 "を意味するので、*待機します。ブロッキングではなく非同期で待機します。 –

答えて

2

待機後のコードは、いわゆる継続として構築されます。

var results1 = await query1.FindAsync(); 

FindAsyncTask構築し、その後awaitが残り、そのタスクの継続でなければならないことを示している:重要な部分は、このラインです。

これは、残りのメソッドが別のTaskになり、そのタスクは最初のタスクが完了した後にのみ実行されることを意味します。さらに、最初のタスクが例外をスローした場合、2番目のタスクは起動されません。

あなたの質問に対する答えは:はい、query2は、query1が完了した後に常に実行されます。

+0

ありがとうございます。好奇心から、非同期メソッドのほとんどのコードが待っているとマークされていれば、それは非同期的な側面を打ち消しませんか?私はあなたがすべてを同期的に実行するかもしれないことを意味します、そうですか?私はその間にUI関連ではないプロセスを暗示しています。 – Polis

+1

CPUの観点から見てみてください。データベースやネットワーク操作のように、CPUに完全にバインドされていない操作は、実行中のスレッドを制御します。これにより、タスクマネージャは同じスレッド上で他のタスクを実行できるようになり、全体的なCPU使用率が向上します。現在のスレッドがブロックされ、別のスレッドが別のタスクのために起動される必要があるため、すべてを同期的に行うとCPU使用率が低下します。 –

0

query1が起動し、このメソッドはquery1が完了するまで実行を停止します。その後、query2が開始されます。あなたはawait query1.FindAsync()Task.WhenAll(...)MSDN

0

はいquery2が実行されるに並列表情でそれらを実行したい場合は結果を返します。しかし、どのスレッドを続行するかに注意してください。場合によります。

同時に実行したい場合はTask.WhenAllメソッドを使用できます。 例:メソッド(s)はあなたがMSDNにhereを見つけたことができWhenAllについて

var firstTask = FirstMethodAsync(); 
var secondTask = SecondMethodAsync(); 
await Task.WhenAll(firstTask, secondTask); 
// Here you can pull out Results from firstTask and secondTask. 
var firstResult = firstTask.Result; 
var secondResult = secondTask.Result; 

詳細情報。