비동기 처리 문제를 추가하는 기능을 제공하는 클래스를 설계하려고합니다. 동기식 프로그래밍에서는 다음과 같이 보일 수 있습니다.
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에서 관찰 한 일관된 접근 방식이없는 것 같습니다.
나는 당신이 무엇을하려고하는지, 왜 그런지 확실하지 않습니다.
—
Nkosi
구현 관찰을 외부 관찰자에게 위임하려고합니다 (다형성과 유사하고 상속에 대한 구성에 대한 요구). 주로 문제의 상속 체인을 피하기 위해 (그리고 실제로는 다중 상속이 필요하기 때문에 불가능합니다).
—
Jeff
우려 사항이 어떤 식 으로든 관련되어 있으며 순차적으로 또는 동시에 처리됩니까?
—
Nkosi
그들은
—
Nkosi
ProcessingArgs
내가 그것에 대해 혼란 스러웠습니다.
그것이 바로 질문의 요점입니다. 이벤트는 작업을 반환 할 수 없습니다. T의 Task를 반환하는 델리게이트를 사용하더라도 결과는 손실됩니다.
—
Jeff