非同期処理の問題を追加する機能を公開するクラスを設計しようとしています。同期プログラミングでは、これは次のようになります。
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();
それぞれの関心事がタスクを返す必要がある非同期の世界では、これはそれほど単純ではありません。私はこれがさまざまな方法で行われるのを見てきましたが、人々が見つけたベストプラクティスがあるかどうか知りたいです。簡単な可能性の1つは
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
私は実装の懸念を外部のオブザーバーに委任しようとしています(ポリモーフィズムと同様に、継承よりも構成を望んでいます)。主に問題のある継承チェーンを回避するためです(多重継承が必要になるため、実際には不可能です)。
—
ジェフ
懸念は何らかの形で関連していますか?それらは順番にまたは並行して処理されますか?
—
Nkosi
彼らはへのアクセスを共有しているようです
—
Nkosi
ProcessingArgs
ので、私はそれについて混乱していました。
それがまさに問題のポイントです。イベントはタスクを返すことができません。Tのタスクを返すデリゲートを使用しても、結果は失われます
—
Jeff