Ich habe eine SchnittstelleWie implementiert man Interface-Methode, die Task <T> zurückgibt?
interface IFoo
{
Task<Bar> CreateBarAsync();
}
Es gibt zwei Methoden Bar
zu erstellen, eine asynchrone und synchrone ein. Ich möchte für jede dieser beiden Methoden eine Schnittstellenimplementierung bereitstellen.
Für die asynchrone Methode könnte die Umsetzung wie folgt aussehen:
class Foo1 : IFoo
{
async Task<Bar> CreateBarAsync()
{
return await AsynchronousBarCreatorAsync();
}
}
Aber wie sollte ich die Klasse Foo2
, die die Synchron Methode Bar
erstellen verwendet implementieren?
I könnte die Methode implementieren synchron auszuführen:
async Task<Bar> CreateBarAsync()
{
return SynchronousBarCreator();
}
Der Compiler wird dann gegen async
in der Methodensignatur mit warnen:
Diese async Methode fehlt 'erwarten' Betreiber und wird synchron laufen. Ziehen Sie in Erwägung, den Operator 'abwarten' zu verwenden, um nicht blockierende API-Aufrufe abzuwarten, oder 'warten Sie auf Task.Run (...)', um CPU-gebundene Arbeit an einem Hintergrund-Thread auszuführen.
Oder ich könnte die Methode implementieren explizit Task<Bar>
zurückzukehren. Meiner Meinung nach wird der Code dann aussieht weniger lesbar:
Task<Bar> CreateBarAsync()
{
return Task.Run(() => SynchronousBarCreator());
}
Aus Performance-Sicht, nehme ich beiden Ansätze etwa den gleichen Kopf hat, oder?
Welchen Ansatz sollte ich wählen? implementieren Sie die async
Methode synchron oder explizit den synchronen Methodenaufruf in eine Task
?
EDIT
Das Projekt an dem ich arbeite ist wirklich ein .NET-4-Projekt mit async/ Erweiterungen aus dem Microsoft Async NuGet Paket erwarten. Auf .NET 4 kann Task.Run
dann durchersetzt werden. Ich habe im obigen Beispiel bewusst die .NET 4.5-Methode verwendet, um die Hauptfrage klarer zu machen.
Für diesen Fall I 'Task.FromResult (SynchronousBarCreator())' glauben ist besser als 'Task.Run (...)', wie es eigentlich nicht planen und eine Aufgabe ausführen um das Ergebnis zu erhalten. –
Läuft 'SynchronBarCreator' lange? Ist es CPU-gebunden oder wartet es auf etwas anderes? – CodesInChaos
In dem Fall, in dem ich gerade arbeite, läuft es nicht lange. Aber es könnte in bevorstehenden Szenarien sein. –