Sie sollte klar sein, über die Rolle async/warten auf das Spiel in der Task Asynchronous Pattern. Das Erstellen einer asynchronen Methode entspricht einer Operation nicht einfach asynchron. Das Markieren einer existierenden Methode async
führt nicht alles magisch asynchron durch. Sein Haupteffekt ist, dass Sie nun await
innerhalb der Methode verwenden dürfen (ich habe gelesen, dass es sogar diskutiert wurde, ob das Schlüsselwort async
überhaupt notwendig war; es wurde hinzugefügt, um eine brechende Änderung zu vermeiden, wenn eine lokale Variable in existierenden Methoden benannt würde await
).
await
bietet auch keine asynchrone selbst, es bietet eine Möglichkeit, mit einer anderen asynchronen Methode und Ausbeute zu synchronisieren, während der andere Vorgang noch ausgeführt wird. Sie können await
eine andere async
Methode, aber wenn nicht irgendwo in der Kette gibt es eine tatsächliche Task
läuft in einem anderen Thread, könnte die asynchrone Methode sogar synchron zurückkehren.
Folglich bedeutet dies, dass Sie eine Operation benötigen, die asynchron erste (wie eine DB-Abfrage, Dateizugriff, Netzwerkkommunikation) läuft und von dort aus einer Kette von async
Methoden erzeugen, die die bisherige Methode await
.
Wenn Sie in einem Fall eine rechenintensive Methode haben, die nicht auf externe Ressourcen wartet, können Sie die Operation asynchron ausführen. Da moderne CPUs in der Regel mehr als einen Kern zur Verfügung haben, können Sie sowohl die Leistung als auch die Reaktionsfähigkeit der Anwendung erhöhen.Das Verfahren wäre nicht async
, da er nichts erwarten:
void DoSomething()
{
//...
}
Task DoSomethingAsync() {
return Task.Run(DoSomething);
}
alle Anrufer von DoSomethingAsync
jetzt await
mit diesem Vorgang läuft im Hintergrund (beachten Sie die Änderung im Gegenzug Typ Task
synchronisieren können Anrufer zu ermöglichen, erwarten):
async Task MajorMethod() {
//...
await DoSomethingAsync();
//...
}
Diese Anrufer von MajorMethod
mit ihm zu synchronisieren zulassen würde. Was Sie auch tun, ist Sachen in MajorMethod
zu tun, während DoSomethingAsync
läuft (und warten noch auf Anrufer zu ermöglichen, noch mehr parallele Operationen zu tun):
async Task MajorMethod() {
//This part will run before DoSomethingAsync
//...
Task doSomethingTask = DoSomethingAsync();
//This part is executed at the same time as DoSomethingAsync
//...
await doSomethingTask; //Here the caller can do more operations while DoSomething is running
//This part will be executed after DoSomethingAsync has finished
//...
}
Diese Form einer Aufgabe zu erwerben, etwas zu tun, und nur dann wartet Die Aufgabe muss irgendwo in der Kette getan werden, sonst haben Sie keinen Vorteil von der asynchronen Operation. Auch wenn dies eine Übergeneralisierung sein könnte, da die Synchronisierung auf subtilere Weise erfolgen kann, z. B. mit einem benutzerdefinierten Synchronisationskontext. Aber was Ihre Frage betrifft, sollten Sie gehen mit: Es gibt eine tatsächliche Aufgabe an einem Ende und etwas, das nach dem asynchronen Anruf gemacht wird, aber vor dem Warten auf das andere Ende.
Es gibt nichts falsch mit der Verwendung von 'Task.Run()' –
Dies kann Ihnen helfen: https://stackoverflow.com/a/18015586/4610605 –