Estou tentando criar uma classe que expõe a capacidade de adicionar preocupações de processamento assíncrono. Na programação síncrona, isso pode parecer
public class ProcessingArgs : EventArgs
{
public int Result { get; set; }
}
public class Processor
{
public event EventHandler<ProcessingArgs> Processing { get; }
public int Process()
{
var args = new ProcessingArgs();
Processing?.Invoke(args);
return args.Result;
}
}
var processor = new Processor();
processor.Processing += args => args.Result = 10;
processor.Processing += args => args.Result+=1;
var result = processor.Process();
em um mundo assíncrono, onde cada preocupação pode precisar retornar uma tarefa, isso não é tão simples. Eu já vi isso de várias maneiras, mas estou curioso para saber se existem práticas recomendadas que as pessoas encontraram. Uma possibilidade simples é
public class Processor
{
public IList<Func<ProcessingArgs, Task>> Processing { get; } =new List<Func<ProcessingArgs, Task>>();
public async Task<int> ProcessAsync()
{
var args = new ProcessingArgs();
foreach(var func in Processing)
{
await func(args);
}
return args.Result
}
}
Existe algum "padrão" que as pessoas adotaram para isso? Não parece haver uma abordagem consistente que observei nas APIs populares.
c#
asynchronous
async-await
Jeff
fonte
fonte
ProcessingArgs
que eu estava confuso sobre isso.Respostas:
O delegado a seguir será usado para lidar com problemas de implementação assíncrona
Dos comentários foi indicado
A classe a seguir permite a criação de um delegado para lidar com essas etapas de maneira fluente, semelhante ao middleware .net core
A extensão a seguir permite uma configuração mais simples em linha usando wrappers
Pode ser estendido ainda mais, conforme necessário, para invólucros adicionais.
Um exemplo de caso de uso do delegado em ação é demonstrado no seguinte teste
fonte
Se você deseja mantê-lo como delegados, pode:
fonte