J'essaie de concevoir une classe qui expose la possibilité d'ajouter des problèmes de traitement asynchrone. En programmation synchrone, cela pourrait ressembler à
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();
dans un monde asynchrone, où chaque préoccupation peut avoir besoin de retourner une tâche, ce n'est pas si simple. J'ai vu cela de nombreuses façons, mais je suis curieux de savoir s'il existe des meilleures pratiques que les gens ont trouvées. Une possibilité simple est
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
}
}
Y a-t-il une "norme" que les gens ont adoptée pour cela? Il ne semble pas y avoir d'approche cohérente que j'ai observée dans les API populaires.
ProcessingArgs
donc j'étais confus à ce sujet.Réponses:
Le délégué suivant sera utilisé pour gérer les problèmes d'implémentation asynchrone
D'après les commentaires, il a été indiqué
La classe suivante permet la création d'un délégué pour gérer ces étapes d'une manière fluide similaire au middleware de base .net
L'extension suivante permet une configuration en ligne plus simple à l'aide de wrappers
Il peut être étendu au besoin pour des enveloppes supplémentaires.
Un exemple de cas d'utilisation du délégué en action est illustré dans le test suivant
la source
Si vous souhaitez le conserver en tant que délégué, vous pouvez:
la source