Я пытаюсь создать класс, который предоставляет возможность добавлять проблемы асинхронной обработки. В синхронном программировании это может выглядеть так
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();
в асинхронном мире, где каждой проблеме может потребоваться вернуть задачу, это не так просто. Я видел, как это делается многими способами, но мне любопытно, есть ли какие-либо лучшие практики, которые люди нашли. Одна простая возможность
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
}
}
Есть ли какой-то «стандарт», который люди приняли для этого? Похоже, что нет единого подхода, который я наблюдал в популярных API.
c#
asynchronous
async-await
Джефф
источник
источник
ProcessingArgs
поэтому я запутался в этом.Ответы:
Следующий делегат будет использоваться для обработки асинхронных проблем реализации
Из комментариев было указано
Следующий класс позволяет создать делегат для быстрой обработки таких шагов, аналогично промежуточному программному обеспечению ядра .net.
Следующее расширение позволяет упростить встроенную настройку с использованием оболочек
Это может быть расширено далее по мере необходимости для дополнительных оберток.
Пример использования делегата в действии демонстрируется в следующем тесте
источник
Если вы хотите сохранить его в качестве делегатов, вы можете:
источник