Es ist besser, anders herum zu gehen. Erstellen Sie die innere Aufgabe als async und lassen Sie dann alle Anrufer, die die async-Methode nicht verwenden können, die asynchrone Methode intern verwenden und darauf warten.
public void MyMethod()
{
MyMethodAsync().Wait();
}
public async Task MyMethodAsync()
{
// do some stuff
}
Beide Methoden machen nichts wirklich async. Bei Async geht es nicht darum, etwas im Hintergrund auszuführen, das ist der Bereich der Task-Bibliothek (oder parallele Erweiterungen oder Threading usw.). Bei Async geht es darum, einen einzelnen Thread für mehrere Dinge wiederzuverwenden, wenn es nichts Besseres zu tun gibt - was die Sache besser skalierbar macht. Wenn Sie eine Pseudo-Async-Methode ausführen, wird nur die Tatsache ausgeblendet, dass Sie einen NEUEN Thread verwenden, anstatt denselben Thread erneut zu verwenden, wodurch das System LESS skalierbar wird.
Um dies zu tun, müssen echte Async-Prozesse auf diese Weise von innen nach außen geschrieben werden. Alles (oder zumindest die Teile, die zeitaufwendig sind) müssen sich auf asynchrone Methoden stützen, die das tun. Zum Beispiel, einen SOAP-Aufruf zu machen, bei dem der Thread im Grunde nur im Leerlauf bleibt, während er darauf wartet, dass der Aufruf zurückkehrt, oder einen Datenbankaufruf oder Datei-I/O. Async erlaubt diesem Thread, etwas anderes zu tun, anstatt nur im Leerlauf zu sitzen.
Das ist nicht wirklich async, es läuft nur auf einem anderen Thread. Es ist besser, wenn Sie in Ihrer asynchronen Methode, die Sie erwarten, tatsächliche E/A-gebundene Arbeit haben, und dann können Sie eine davon synchronisieren. – juharr
Behalten Sie einfach die 'Async'-Methode bei, und lassen Sie dann den Verbraucher entscheiden, ob er darauf warten möchte. Es ist nur Zucker, der den anderen hält. – Jonesopolis
Ich würde MyMethodAsync überhaupt nicht machen, sondern den Aufrufer den 'Task.Run (() => myClass.MyMethod()); -Aufruf machen lassen. Es ist keine gute Methode, "[fake async] (http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html)" -Methoden zu erstellen. –