Ich versuche, eine Klasse zu entwerfen, die die Möglichkeit bietet, Bedenken hinsichtlich der asynchronen Verarbeitung hinzuzufügen. Bei der synchronen Programmierung könnte dies so aussehen
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();
In einer asynchronen Welt, in der jedes Unternehmen möglicherweise eine Aufgabe zurückgeben muss, ist dies nicht so einfach. Ich habe dies auf viele Arten gesehen, aber ich bin gespannt, ob es Best Practices gibt, die die Leute gefunden haben. Eine einfache Möglichkeit ist
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
}
}
Gibt es einen "Standard", den die Leute dafür übernommen haben? Es scheint keinen konsistenten Ansatz zu geben, den ich bei gängigen APIs beobachtet habe.
c#
asynchronous
async-await
Jeff
quelle
quelle
ProcessingArgs
also war ich darüber verwirrt.Antworten:
Der folgende Delegat wird verwendet, um Probleme mit der asynchronen Implementierung zu behandeln
Aus den Kommentaren ging hervor
Die folgende Klasse ermöglicht den Aufbau eines Delegaten, der solche Schritte fließend wie die .net Core Middleware abwickelt
Die folgende Erweiterung ermöglicht eine einfachere Inline-Einrichtung mithilfe von Wrappern
Es kann bei Bedarf für zusätzliche Wrapper weiter erweitert werden.
Ein Beispiel für einen Anwendungsfall des in Aktion befindlichen Delegaten wird im folgenden Test demonstriert
quelle
Wenn Sie es als Delegierte behalten möchten, können Sie:
quelle