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?
}
fonte
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.Stream.ReadAsync()
em um método, esse método deve ser assíncrono e retornar umTask<T>
ondeT
é 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 aStream.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.Respostas:
O
async
equivalente aAction<T>
éFunc<T, Task>
, então acredito que é isso que você está procurando:fonte
void
método é umTask
método de retorno; assim, o equivalente assíncrono deAction
éFunc<Task>
e o equivalente assíncrono deAction<T>
éFunc<T, Task>
. Mais informações aqui .Task
quando não tiver um valor de retorno. Se ele usar aasync
palavra - chave, aTask
instância real será criada por uma máquina de estado, não diretamente pela função.Então, acredito que a maneira de implementar isso é:
fonte
Task.Run
(e mais aindaStartNew
) no ASP.NET.