我想聽聽有關處理與Command模式異步操作的最佳方式的意見。假設我們有下面的例子:在C#中處理異步操作的命令模式和異步操作
public class MyCommand
{
// Sets up receiver and does whatever stuff
public void Execute()
{
_myReceiver.DoSomething();
}
}
的問題是:mycommand的不知道MyReceiver.DoSomething()是否有代碼的異步部分。如果我想在執行後將MyCommand推入撤消堆棧,我無法保證其接收器操作已完全執行,因此無法確定MyCommand是否達到撤銷可能或不可撤銷的狀態。
我個人認爲以下解決方案:
- 實現某種在命令國家控制的
- 在命令中包含「BeginExecute」和「EndExecute」
- 納入MyReceiver事件和make命令訂閱他們(似乎臭我)
爲了總結的東西了,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
}
我現在有辦法確保Command的接收器已經完成執行任何動作,並且它已準備好被推入撤消堆棧。但是,對於事件垃圾郵件,每個包含異步操作的Receiver類都會讓我感到不安。
我在互聯網上沒有發現太多有關這個主題的內容,並且很想聽聽不同的方法。
OBS:使命令管理所有與異步相關的代碼不是一個選項:)。
你怎麼能說你不知道是否_myReceiver.DoSomething();有一些異步屬性。它要麼完成,所以你知道它已經完成了,要麼它會返回一些讓你控制異步行爲的東西。無論哪種方式,_myReceiver.DoSomething()都可能有問題。而不是你的命令。 – Euphoric 2012-01-05 21:25:59
Async除了撤消部分看起來如何 - 命令一個UndoExecution或...? – 2012-01-05 21:27:20
@Euphoric的DoSomething方法可以.BeginInvoke的東西... – 2012-01-05 21:29:20