Ich habe this question verfolgt und ich verstehe die Gründe für die beliebte (wenn auch noch nicht angenommene) Antwort von Peter Duniho. Insbesondere Ich weiß, daß nicht eine nachfolgende langlaufende Operation wartet den UI-Thread Block:Sollten erwartete, erwartete Operationen erwartet werden?
Das zweite Beispiel, das nicht während der asynchronen Operation nicht ergeben. Stattdessen erzwingen Sie durch Abrufen des Werts der content.Result-Eigenschaft, dass der aktuelle Thread wartet, bis der asynchrone Vorgang abgeschlossen ist.
Ich habe bestätigt, auch dies, denn meine eigenen Vorteil, etwa so:
private async void button1_Click(object sender, EventArgs e)
{
var value1 = await Task.Run(async() =>
{
await Task.Delay(5000);
return "Hello";
});
//NOTE: this one is not awaited...
var value2 = Task.Run(async() =>
{
await Task.Delay(5000);
return value1.Substring(0, 3);
});
System.Diagnostics.Debug.Print(value2.Result); //thus, UI freezes here after 5000 ms.
}
Aber jetzt frage ich mich: Sie brauchen zu await
alle „awaitable“ Operationen innerhalb einer äußersten awaitable verschachtelt Betrieb? Zum Beispiel kann ich dies tun:
private async void button1_Click(object sender, EventArgs e)
{
var value0 = await Task.Run(() =>
{
var value1 = new Func<Task<string>>(async() =>
{
await Task.Delay(5000);
return "hello";
}).Invoke();
var value2 = new Func<string, Task<string>>(async (string x) =>
{
await Task.Delay(5000);
return x.Substring(0, 3);
}).Invoke(value1.Result);
return value2;
});
System.Diagnostics.Debug.Print(value0);
}
Oder ich kann dies tun:
private async void button1_Click(object sender, EventArgs e)
{
//This time the lambda is async...
var value0 = await Task.Run(async() =>
{
//we're awaiting here now...
var value1 = await new Func<Task<string>>(async() =>
{
await Task.Delay(5000);
return "hello";
}).Invoke();
//and we're awaiting here now, too...
var value2 = await new Func<string, Task<string>>(async (string x) =>
{
await Task.Delay(5000);
return x.Substring(0, 3);
}).Invoke(value1);
return value2;
});
System.Diagnostics.Debug.Print(value0);
}
Und keiner von ihnen die Benutzeroberfläche einzufrieren. Welche ist vorzuziehen?
ich sehr überrascht sein, wenn alle die gleiche Sache zu drucken, ich glaube, dass man eine Aufgabe Objekt druckt eher als sein Ergebnis. –
@BenVoigt - Nein, bc In beiden Fällen wird die Aufgabe ausgepackt, da sie erwartet wird. –
Aber eine davon ist das Umpacken einer zweiten Aufgabe. –