Próbuję zaprojektować klasę, która ujawnia możliwość dodawania problemów związanych z przetwarzaniem asynchronicznym. W programowaniu synchronicznym może to wyglądać
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();
w świecie asynchronicznym, gdzie każdy koncern może potrzebować zwrócić zadanie, nie jest to takie proste. Widziałem to na wiele sposobów, ale jestem ciekawy, czy istnieją jakieś najlepsze praktyki, które ludzie znaleźli. Jedną z prostych możliwości jest
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
}
}
Czy istnieje jakiś „standard”, który ludzie przyjęli w tym celu? Wydaje się, że nie ma spójnego podejścia, które zaobserwowałem w popularnych interfejsach API.
c#
asynchronous
async-await
Jeff
źródło
źródło
ProcessingArgs
więc byłem zdezorientowany.Odpowiedzi:
Następujący delegat będzie używany do obsługi problemów związanych z implementacją asynchroniczną
Z komentarzy zostało wskazane
Następująca klasa umożliwia zbudowanie delegata do płynnego wykonywania takich kroków, podobnie jak w przypadku oprogramowania pośredniego z rdzeniem .net
Poniższe rozszerzenie pozwala na prostszą instalację w linii za pomocą owijarek
W razie potrzeby można go rozszerzyć o dodatkowe owijarki.
Przykładowy przypadek użycia delegata w akcji pokazano w poniższym teście
źródło
Jeśli chcesz zachować go jako delegatów, możesz:
źródło