2016-06-20 10 views
0

同じ時間に複数のアクションを実行します。は私がやる</p> <p>(私が使用<code>Parallel.ForEach</code>を望んでいない)私はタスク非同期(async)使用して、同じ時間に複数のループを実行したい

static async void Run() 
{ 
    await MultiTasks(); 
} 

static async Task MultiTasks() 
{ 
    var Loop1 = Loop1Async(); 
    var Loop2 = Loop2Async(); 

    await Loop1; 
    await Loop2; 
} 

static async Task Loop1Async() 
{ 
    for (int i = 0; i < 500; i++) 
    { 
     Console.WriteLine("Loop 1 : " + i); 
    } 
} 

static async Task Loop2Async() 
{ 
    for (int i = 0; i < 500; i++) 
    { 
     Console.WriteLine("Loop 2 : " + i); 
    } 
} 

Run()は、私の中で呼ばれています主な方法。

しかし、2つのループは同時に実行されません。最初のラップが完了すると、2回目が始まります

なぜ、どうやってこれを行うのですか?

+1

を持っている必要がありますasyncことにする方法については –

+0

@DStanleyあなたはおそらく 'Thread.Sleep'ではなく他のメソッドを意味しています...誰もが' Task.Delay'が "sleep"であることを知っているわけではありません... –

答えて

1

.WhenAll(...)

static async Task MultiTasks() 
{ 
    var Loop1 = Loop1Async(); 
    var Loop2 = Loop2Async(); 

    await Task.WhenAll(Loop1, Loop2); 
} 

他の人が指摘したように、あなたのasync方法は、現在の実行が得られていない試してみてください。

実際に並列に実行できるように、スレッドがシステムに戻ってくるようなものが必要です。このような何か...

static async Task Loop1Async() 
{ 
    for (int i = 0; i < 500; i++) 
    { 
     Console.WriteLine("Loop 1 : " + i); 
     await Task.Yield(); 
    } 
} 

static async Task Loop2Async() 
{ 
    for (int i = 0; i < 500; i++) 
    { 
     Console.WriteLine("Loop 2 : " + i); 
     await Task.Yield(); 
    } 
} 
6

あなたはawaitのユーザーを初心者するための共通の根本的な誤解があります。

私はこれについて非常に明確にしましょう。 Awaitは非同期の何かを作成しません。は、非同期操作が非同期的に完了するのを待ってを完了します。

同期動作を待機しています。呼び出しているメソッドについては、非同期的なものはまったくありません。それらを非同期にすることはありません。むしろ、の非同期だった場合、awaitは呼び出し元に制御を直ちに返し、呼び出し元は引き続き作業を行うことができます。非同期作業が終了すると、将来のある時点で残りのメソッドが実行され、結果はawaitとなります。

1

Loop1AsyncおよびLoop2Asyncは、実際に同期しています。 WriteLineAsyncメソッドの使用を検討してください。

Task.WhenAllMultiTasksに使用することもできます。

0

Loop1AsyncLoop2Asyncメソッドは、内部で待機していません。 `Loop1Async`と` Loop2Async`が実際のコードは、あなたが期待する結果を生成する非同期希望の場合...しかし、同期コードは、単に正常に実行され、両方以来。それが1以上await

関連する問題

 関連する問題