Actualmente estoy tratando de hacer mi aplicación usando algunos métodos Async. Todo mi IO se realiza a través de implementaciones explícitas de una interfaz y estoy un poco confundido acerca de cómo hacer que las operaciones sean asincrónicas.
Como veo las cosas tengo dos opciones en la implementación:
interface IIO
{
void DoOperation();
}
OPCIÓN1: Realice una implementación implícita asíncrona y espere el resultado en la implementación implícita.
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
}
OPCIÓN 2: Realice la implementación explícita de forma asíncrona y espere la tarea de la implementación implícita.
class IOAsyncImplementation : IIO
{
private Task DoOperationAsync()
{
return new Task(() =>
{
//DO ALL THE HEAVY LIFTING!!!
});
}
#region IIOAsync Members
async void IIO.DoOperation()
{
await DoOperationAsync();
}
#endregion
}
¿Es una de estas implementaciones mejor que la otra o hay otro camino por recorrer en el que no estoy pensando?
fuente
async
):async Task IIO.DoOperationAsync()
. ¿Y te refieres a dóndeawait
los regresasteTask
? Dondequiera que llamesDoOperationAsync()
.Task.Run()
, ese código IO debería ser asíncrono en sí mismo y lo haríaawait
directamente. Ejline = await streamReader.ReadLineAsync()
.Una mejor solución es introducir otra interfaz para operaciones asíncronas. La nueva interfaz debe heredar de la interfaz original.
Ejemplo:
PD: Rediseñe sus operaciones asincrónicas para que devuelvan Task en lugar de void, a menos que realmente deba devolver void.
fuente
GetAwaiter().GetResult()
lugar deWait()
? De esa manera, no es necesario descomprimir unAggregateException
para obtener la excepción interna.class Impl : IIO, IIOAsync
. IIO y IIOAsync en sí mismos, sin embargo, son contratos diferentes que pueden evitar incluir "contratos antiguos" en un código más nuevo.var c = new Impl(); IIOAsync asAsync = c; IIO asSync = c
.