2016-07-25 6 views
3

Dies ist meine Implementierung von Asynchron/erwartet in Windows Forms-AnwendungVerwirrung über die richtige Verwendung von Async/Await

async Task<int> DoAysnc1() 
{ 
    await Task.Delay(3000); 
    return 3000; 
} 

async Task<int> DoAsync2() 
{ 
    await Task.Delay(5000); 
    return 5000; 
} 

private async void button1_Click(object sender, EventArgs e) 
{ 
    this.textBox1.Text = ""; 
    var doAsync1 = DoAysnc1(); 
    var doAsync2 = DoAysnc2(); 
    var async1 = await doAsync1; 
    var async2 = await doAsync2; 
    this.textBox1.Text = $"{async1} & {async2}"; 
} 

Nach 5 Sekunden, um das Ergebnis in dem Text ist "3000 & 5000".

Aber wenn ich ändern button1_Click wie folgt aus:

private async void button1_Click(object sender, EventArgs e) 
{ 
    this.textBox1.Text = ""; 
    var async1 = await DoAysnc1(); 
    var async2 = await DoAysnc2(); 
    this.textBox1.Text = $"{async1} & {async2}"; 
} 

das Ergebnis ist das gleiche, aber es dauert 8 Sekunden.

Warum zweite Version von button1_Click als synchron arbeiten?

+1

Im zweiten Fall führen Sie 'DoAsync2()' nicht aus, bis 'DoAsync1()' fertig ist. Ist das nicht klar? Es gibt ein schönes Bild auf [msdn] (https://msdn.microsoft.com/en-us/library/mt674882.aspx), das erklärt, was hinter 'async/await 'vorgeht, bitte studieren. – Sinatr

+0

Wenn eine Referenz auf eine 'Task' genommen wird, beginnt sie mit der Ausführung! 'erwarten' sagt, wenn du fertig bist, gib meine Methode hier wieder ein. –

+0

http://stackoverflow.com/documentation/c%23/48/async-wait#t=201607251201374786908 – Neel

Antwort

5

Nachfolgend finden Sie die Erklärung des Unterschieds:

this.textBox1.Text = ""; 
var doAsync1 = DoAysnc1();   // <--- Run DoAsync1 
var doAsync2 = DoAysnc2();   // <--- Run DoAsync2 
var async1 = await doAsync1;  // <--- wait for DoAsync1 to finish 
var async2 = await doAsync2;  //<--- wait for DoAsync2 to finish 
this.textBox1.Text = $"{async1} & {async2}"; 

While:

this.textBox1.Text = ""; 
var async1 = await DoAysnc1();   // <-- Run DoAsync1 and wait for it to be done 
var async2 = await DoAysnc2();   // <-- Run DoAsync2 and wait for it to be done 
this.textBox1.Text = $"{async1} & {async2}"; 

So in der ersten Version, beide Aufgaben gleichzeitig ausgeführt werden. Während in der zweiten Version die zweite Aufgabe nie ausgeführt wird, bis die erste abgeschlossen ist.

Ich denke, das Lesen Article wird ein großes Plus für Ihr Wissen sein.

4

Mit einigen Kommentaren zu machen, was passiert eigentlich mehr klar:

// Starts DoAsync1 asynchronously 
var doAsync1 = DoAysnc1(); 

// Starts DoAsync2 asynchronously 
var doAsync2 = DoAysnc2(); 

// From now on, both task are executing 

// Wait for DoAsync1 completion 
var async1 = await doAsync1; 

// Wait for DoAsync2 completion 
var async2 = await doAsync2; 

Für den zweiten Fall:

// Starts DoAsync1 asynchronously, and wait for the task completion (3s) 
var async1 = await DoAysnc1(); 

// Starts DoAsync2 asynchronously, and wait for the task completion (5s) 
var async2 = await DoAysnc2(); 
2

DoAsync1 und DoAsync2 Rückkehr awaitable Task -Objekte. Wenn Sie sie nacheinander erwarten, werden sie nacheinander ausgeführt (warten Sie zuerst auf den ersten, dann auf den zweiten). Um sie parallel laufen zu lassen, können Sie einfach zuerst die Task-Objekte erstellen und mit Task.WhenAll auf deren Ergebnisse warten.

private async void button1_Click(object sender, EventArgs e) 
{ 
    this.textBox1.Text = ""; 

    var task1 = DoAysnc1(); 
    var task2 = DoAysnc2(); 
    await Task.WhenAll(task1, task2) 

    this.textBox1.Text = $"{task1.Result} & {task2.Result}"; 
} 
Verwandte Themen