2016-06-20 10 views
0

ich mehrere Schleifen in der gleichen Zeit mit Asynchron-Aufgabe (ich will nicht, dass die Verwendung Parallel.ForEach)Führen Sie mehrere Aktionen in der gleichen Zeit

ich ausführen möchten: in

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() heißt mein Hauptmethode.

Aber die zwei Schleife wird nicht in der gleichen Zeit ausgeführt. Sobald die erste Runde abgeschlossen ist, beginnt die zweite

Warum und wie das zu tun?

+1

Wenn "Loop1Async" und "Loop2Async" wäre eigentlich asynchron würde der Code Ergebnisse produzieren, die Sie erwarten ... Aber da beide synchronen Code einfach normal ausgeführt werden. –

+0

@DStanley du meinst wahrscheinlich eine andere Methode, nicht 'Thread.Sleep' ... Nicht jeder weiß, dass' Task.Delay' "Schlaf" ist ... –

Antwort

1

Versuchen .WhenAll(...)

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

    await Task.WhenAll(Loop1, Loop2); 
} 

Wie andere haben darauf hingewiesen, Ihre async Methoden im Moment keine Ausführung ergeben.

Sie benötigen etwas, das es Threads erlaubt, dem System nachzugeben, damit sie tatsächlich parallel ablaufen können. So etwas wie dies ...

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

Sie haben das grundlegende Missverständnis gemeinsamen Anwender von await für Anfänger.

Lassen Sie mich sehr klar darüber sein. Wartet etwas nicht asynchron. Es wartet asynchron auf einen asynchronen Vorgang, um abzuschließen.

Sie warten auf einen synchronen Vorgang. Es gibt absolut nichts Asynchrones an den Methoden, die Sie aufrufen; Warten macht sie nicht asynchron. Eher, wenn sie waren asynchron, dann würde die await Steuerung sofort an den Anrufer zurückgeben, so dass der Anrufer weiterhin arbeiten könnte. Wenn die asynchrone Arbeit beendet ist, wird zu irgendeinem Zeitpunkt in der Zukunft der Rest der Methode ausgeführt, mit dem Ergebnis await ed.

1

Loop1Async und Loop2Async in der Tat sind synchron. Erwägen Sie die Verwendung der Methode WriteLineAsync.

Sie können auch Task.WhenAll in MultiTasks verwenden.

0

Ihre Loop1Async und Loop2Async Methoden haben keine warten innen. Für eine Methode zu sein async muss es 1 oder mehr haben await