HandleExternalEvent、Delay、EventDriven、Listen、EventHandlingScope 五大事件活動| 活動 | 類型 | 核心作用 |
|---|---|---|
| HandleExternalEvent | 基本 | 處理外部事件(宿主→工作流),需指定 InterfaceType、EventName、CorrelationToken |
| Delay | 基本 | 實作 IEventActivity,TimeoutDuration 到期觸發事件,可構建計時器 |
| EventDriven | 組合 | 順序容器,**首個子活動必須為 IEventActivity**,事件觸發前不執行內容 |
| Listen | 組合 | 並行容器,**僅容納 EventDriven**(≥2),先觸發者執行,其餘取消 |
| EventHandlingScope | 組合 | 含事件處理器集合 + 單一非事件子活動,事件全處理完才繼續後續流程 |
Listen 禁止用於 State Machine 工作流,防止事件循環(類似死鎖)EventDriven 父活動僅限 Listen、State、StateMachineWorkflowwca.exe 針對通訊介面產生強型別活動(衍生自 CallExternalMethod/HandleExternalEvent),自動綁定事件參數屬性[ExternalDataExchange]
public interface IWFBroker {
void MarketUpdate(string xmlMarketValues); // 工作流→宿主
event EventHandler AddTicker;
event EventHandler RemoveTicker;
event EventHandler BuyStock;
event EventHandler SellStock;
event EventHandler Stop;
}
事件參數:TickerActionEventArgs(XML 股票資訊)、SharesActionEventArgs(代碼+張數)、StopActionEventArgs(無資料)。
Code(Initialize):初始化輪詢間隔、載入股票字典EventHandlingScope:
EventDriven → Stop 監聽停止指令While(TestContinue=true) → Sequence →
Code(UpdateMarketValues):蒙地卡羅模擬產生新價格、趨勢、買賣建議MarketUpdate:序列化更新集合 XML 發送宿主Listen(5 條分支):
EventDriven → Delay(updateDelay):輪詢計時器EventDriven → SellStock → Code(SellStock)EventDriven → BuyStock → Code(BuyStock)EventDriven → RemoveTicker → Code(RemoveTicker)EventDriven → AddTicker → Code(AddTicker)Listen 中 Delay 觸發 → While 繼續下一輪;其他事件觸發 → 執行對應代碼 → Listen 結束 → While 重新進入 Listen 監聽。
實作 IWFBroker,提供 RaiseAddTicker 等方法供宿主調用觸發事件。宿主透過 _workflowRuntime.GetService<BrokerDataConnector>() 取得服務實例,調用 RaiseXxx(instanceId, ...) 將使用者操作推送至工作流。
RaiseStop)工作流與宿主若共享物件參考,需注意同步。本範例採用 XML 序列化傳遞資料,避免共享狀態。若必須共享,建議實作 ICloneable 或使用序列化隔離。
事件活動構建了 WF 響應式程式設計基石:HandleExternalEvent 接收外部通知,Delay 提供時間觸發,EventDriven/Listen 編排順序/並行事件處理,EventHandlingScope 整合背景事件監聽與前台流程。配合 wca.exe 強型別活動與本地通訊服務,可快速建立宿主與工作流雙向通訊的企業級應用。