Estoy tratando de diseñar una clase que exponga la capacidad de agregar problemas de procesamiento asincrónico. En la programación síncrona, esto podría verse así
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();
En un mundo asincrónico, donde cada preocupación puede necesitar devolver una tarea, esto no es tan simple. He visto esto de muchas maneras, pero tengo curiosidad por saber si hay alguna mejor práctica que la gente haya encontrado. Una posibilidad simple es
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
}
}
¿Hay algún "estándar" que la gente haya adoptado para esto? No parece haber un enfoque coherente que haya observado en las API populares.
c#
asynchronous
async-await
Jeff
fuente
fuente
ProcessingArgs
así que estaba confundido sobre eso.Respuestas:
El siguiente delegado se usará para manejar problemas de implementación asincrónica
De los comentarios se indicó
La siguiente clase permite la creación de un delegado para manejar dichos pasos de manera fluida similar al middleware de .net core
La siguiente extensión permite una configuración en línea más simple utilizando envoltorios
Se puede extender aún más según sea necesario para envoltorios adicionales.
Un ejemplo de caso de uso del delegado en acción se demuestra en la siguiente prueba
fuente
Si desea mantenerlo como delegados, puede:
fuente