我正在尝试设计一个类,以公开添加异步处理问题的能力。在同步编程中,这可能看起来像
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中似乎没有观察到一致的方法。
我不确定您要做什么以及为什么这么做。
—
恩科西
我试图将实现的关注点委托给外部观察者(类似于多态和对继承的渴望)。主要是为了避免有问题的继承链(并且实际上是不可能的,因为这将需要多重继承)。
—
杰夫
这些关注点是否以任何方式相关,并且将按顺序或并行处理?
—
恩科西
他们似乎共享访问权限,
—
恩科西
ProcessingArgs
因此对此我感到困惑。
这正是问题的重点。事件无法返回任务。即使我使用返回T任务的委托,结果也将丢失
—
Jeff