Ich versuche derzeit, meine Anwendung mit einigen Async-Methoden zu erstellen. Alle meine E / A-Vorgänge werden durch explizite Implementierungen einer Schnittstelle ausgeführt, und ich bin etwas verwirrt darüber, wie die Vorgänge asynchronisiert werden sollen.
Aus meiner Sicht habe ich zwei Möglichkeiten bei der Implementierung:
interface IIO
{
void DoOperation();
}
OPTION1: Führen Sie eine implizite Implementierung asynchron durch und warten Sie auf das Ergebnis in der impliziten Implementierung.
class IOImplementation : IIO
{
async void DoOperation()
{
await Task.Factory.StartNew(() =>
{
//WRITING A FILE OR SOME SUCH THINGAMAGIG
});
}
#region IIO Members
void IIO.DoOperation()
{
DoOperation();
}
#endregion
}
OPTION2: Führen Sie die explizite Implementierung asynchron durch und warten Sie auf die Aufgabe der impliziten Implementierung.
class IOAsyncImplementation : IIO
{
private Task DoOperationAsync()
{
return new Task(() =>
{
//DO ALL THE HEAVY LIFTING!!!
});
}
#region IIOAsync Members
async void IIO.DoOperation()
{
await DoOperationAsync();
}
#endregion
}
Ist eine dieser Implementierungen besser als die andere oder gibt es einen anderen Weg, an den ich nicht denke?
quelle
async
) :async Task IIO.DoOperationAsync()
. Und meinst du, wo kommst duawait
zurückTask
? Wo immer Sie anrufenDoOperationAsync()
.Task.Run()
, da der E / A-Code selbst asynchron sein sollte und Sie diesawait
direkt tun würden . ZBline = await streamReader.ReadLineAsync()
.Eine bessere Lösung besteht darin, eine weitere Schnittstelle für asynchrone Vorgänge einzuführen. Die neue Schnittstelle muss von der ursprünglichen Schnittstelle erben.
Beispiel:
PS Entwerfen Sie Ihre asynchronen Vorgänge so, dass sie Task anstelle von void zurückgeben, es sei denn, Sie müssen void wirklich zurückgeben.
quelle
GetAwaiter().GetResult()
stattWait()
? Auf diese Weise müssen Sie keine entpackenAggregateException
, um die innere Ausnahme abzurufen.class Impl : IIO, IIOAsync
. IIO und IIOAsync selbst sind jedoch unterschiedliche Verträge, die verhindern können, dass "alte Verträge" in neueren Code übernommen werden.var c = new Impl(); IIOAsync asAsync = c; IIO asSync = c
.