No momento, estou tentando fazer meu aplicativo usando alguns métodos Async. Todo o meu IO é feito por meio de implementações explícitas de uma interface e estou um pouco confuso sobre como tornar as operações assíncronas.
A meu ver, tenho duas opções de implementação:
interface IIO
{
void DoOperation();
}
OPÇÃO1: Faça uma implementação implícita assíncrona e aguarde o resultado na implementação 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
}
OPÇÃO2: Faça a implementação explícita de forma assíncrona e aguarde a tarefa da implementação 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
}
Uma dessas implementações é melhor do que a outra ou há outro caminho a seguir que não estou pensando?
fonte
async
):async Task IIO.DoOperationAsync()
. E você quer dizer onde vocêawait
voltouTask
? Para onde você ligarDoOperationAsync()
.Task.Run()
, esse código IO deve ser assíncrono e você fariaawait
isso diretamente. Exline = await streamReader.ReadLineAsync()
.A melhor solução é apresentar outra interface para operações assíncronas. A nova interface deve ser herdada da interface original.
Exemplo:
PS Redesenhe suas operações assíncronas para que retornem Task em vez de void, a menos que você realmente precise retornar void.
fonte
GetAwaiter().GetResult()
vez deWait()
? Dessa forma, você não precisa descompactar umAggregateException
para buscar a exceção interna.class Impl : IIO, IIOAsync
. IIO e IIOAsync, entretanto, são contratos diferentes que podem evitar a inclusão de 'contratos antigos' em códigos mais novos.var c = new Impl(); IIOAsync asAsync = c; IIO asSync = c
.