In jedem Blog-Beitrag, den ich gelesen habe, erfahren Sie, wie Sie eine asynchrone Methode in C # verwenden. Erklären Sie jedoch aus irgendeinem Grund niemals, wie Sie Ihre eigenen asynchronen Methoden zum Konsumieren erstellen. Ich habe jetzt diesen Code, der meine Methode verbraucht:
private async void button1_Click(object sender, EventArgs e)
{
var now = await CountToAsync(1000);
label1.Text = now.ToString();
}
Und ich habe diese Methode geschrieben CountToAsync
:
private Task<DateTime> CountToAsync(int num = 1000)
{
return Task.Factory.StartNew(() =>
{
for (int i = 0; i < num; i++)
{
Console.WriteLine("#{0}", i);
}
}).ContinueWith(x => DateTime.Now);
}
Ist dies Task.Factory
die beste Möglichkeit, eine asynchrone Methode zu schreiben, oder sollte ich dies anders schreiben?
c#
async-await
c#-5.0
Khalid Abuhakmeh
quelle
quelle
Antworten:
Ich empfehle nicht, es
StartNew
sei denn, Sie benötigen diese Komplexität.Wenn Ihre asynchrone Methode von anderen asynchronen Methoden abhängig ist, verwenden Sie am einfachsten das
async
Schlüsselwort:Wenn Ihre asynchrone Methode CPU-Arbeit leistet, sollten Sie Folgendes verwenden
Task.Run
:Sie können mein
async
/await
Intro hilfreich finden.quelle
TaskFactory.FromAsync
zum Wickeln verwendenBeginInvoke
. Nicht sicher, was Sie mit "Rückrufcode" meinen; Fühlen Sie sich frei, Ihre eigene Frage mit Code zu posten.Task.Delay
Rückkehr aufgerufen ?await
ist eine "asynchrone Wartezeit", daher wird erst mit der nächsten Iteration fortgefahren, nachdem die von zurückgegebene AufgabeTask.Delay
abgeschlossen ist.Wenn Sie async / await nicht in Ihrer Methode verwenden möchten, es aber dennoch "dekorieren" möchten, um das Schlüsselwort await von außen verwenden zu können, TaskCompletionSource.cs :
Von hier und hier
Ich habe gesehen, dass es auch in der .NET-Quelle verwendet wird, z. WebClient.cs :
Schließlich fand ich auch folgendes nützlich:
Einführung in Async / Await unter ASP.NET
Wenn das Ziel darin besteht, die Skalierbarkeit (und nicht die Reaktionsfähigkeit) zu verbessern, hängt alles von der Existenz einer externen E / A ab, die die Möglichkeit dazu bietet.
quelle
Eine sehr einfache Möglichkeit, eine Methode asynchron zu machen, ist die Verwendung der Task.Yield () -Methode. Wie MSDN feststellt:
Fügen Sie es am Anfang Ihrer Methode ein und es kehrt sofort zum Aufrufer zurück und schließt den Rest der Methode in einem anderen Thread ab.
quelle
Task.Yield()
ist in der Tat nützlich, wenn Sie sicherstellen möchten, dass die RücksendungTask
bei der Erstellung nicht sofort abgeschlossen wird.