Um pouco de informação de fundo.
Estou aprendendo a pilha da API da Web e estou tentando encapsular todos os dados na forma de um objeto "Resultado" com parâmetros como Success e ErrorCodes.
Métodos diferentes, no entanto, produziriam resultados e códigos de erro diferentes, mas o objeto de resultado geralmente seria instanciado da mesma maneira.
Para economizar tempo e também para aprender mais sobre os recursos assíncronos / aguardados em C #, estou tentando agrupar todos os corpos de métodos das minhas ações de API da Web em um delegado de ação assíncrona, mas foi pego em alguns obstáculos ...
Dadas as seguintes classes:
public class Result
{
public bool Success { get; set; }
public List<int> ErrorCodes{ get; set; }
}
public async Task<Result> GetResultAsync()
{
return await DoSomethingAsync<Result>(result =>
{
// Do something here
result.Success = true;
if (SomethingIsTrue)
{
result.ErrorCodes.Add(404);
result.Success = false;
}
}
}
Eu quero escrever um método que executa uma ação em um objeto Result e devolvê-lo. Normalmente através de métodos síncronos seria
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Mas como transformar esse método em um método assíncrono usando async / waitit?
Isto é o que eu tentei:
public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody)
where T: Result, new()
{
// But I don't know what do do from here.
// What do I await?
}
Stream.ReadAsync()
em um método, esse método deve ser assíncrono e retornar um Task<T>
onde T
é o que você teria retornado se o método fosse síncrono. A idéia é que, dessa maneira, todo chamador do seu método possa "esperar de forma assíncrona" (não sei qual é um bom termo para isso) para a Stream.ReadAsync()
conclusão do subjacente . Uma metáfora para isso que você pode usar é que o assíncrono é "infeccioso" e se espalha da E / S interna de baixo nível para outro código cujos resultados dependem dos da referida E / S.
new
iniciandoT
, por que seu método precisa ser assíncrono? AFAIK no código usando APIs assíncronas, você só precisa propagar oasync
ness de outros métodos usados.