Commandパターンで非同期操作を処理する最良の方法について意見を聞きたいと思います。C#でのコマンドパターンと非同期操作の処理
public class MyCommand
{
// Sets up receiver and does whatever stuff
public void Execute()
{
_myReceiver.DoSomething();
}
}
問題がされています:MyCommandはMyReceiver.DoSomethingは()のコードの非同期部分を持っているかどうかわからない私たちは、次の例を持っていると言います。実行後にMyCommandを元に戻すスタックにプッシュしたい場合、MyCommandが元に戻すことが可能な状態に達したかどうかを知ることが不確かなため、そのレシーバーアクションが完全に実行されたことを保証できませんでした。
私は個人的には、以下のソリューションに考えた:
- が
- がMyReceiver内のイベントを含める
- は、コマンドに「BeginExecute」と「EndExecute」が含まれるコマンドの状態制御のいくつかの並べ替えを実装し、コマンドをサブスクライブします 012:彼らに物事をラップするために、MyCommandに変わるでしょう
(それは私には臭いと思われます)
public class MyCommand
{
public MyCommand(MyReceiver receiver)
{
_myReceiver = receiver;
_myReceiver.DoSomethingFinished +=() => this.EndExecute();
}
public void BeginExecute()
{
this.EnterExecutionState();
_myReceiver.DoSomething();
}
public void EndExecute()
{
this.LeaveExecutionState();
}
// State handling related stuff
}
コマンドの受信者が何らかのアクションを実行し、アンドゥスタックにプッシュする準備ができていることを確認する手段があります。しかし、イベント・スパムには、非同期操作を含むすべてのReceiverクラスが本当にバグしています。
私はインターネット上でこのトピックについて多くを見出しておらず、さまざまなアプローチを聞きたいと思っています。
OBS:すべての非同期関連のコードを管理するコマンドはオプションではありません:)。
どのようにあなたが_myReceiver.DoSomething();いくつかの非同期プロパティがあります。それが完了するか、完了したことを知るか、非同期動作を制御できる何かを返します。いずれにしても、おそらく_myReceiver.DoSomething()に何か問題があります。あなたの命令ではありません。 – Euphoric
非同期を除いて、元に戻す部分がどのように見えますか?UndoExecutionまたは...をコマンドしますか? –
@ Humphoric DoSomethingメソッドは.BeginInvoke something ... –