首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF 從入門到精通(第十一章):並行活動與同步控制全解析

     編輯:關於.NET

學習重點

  • 掌握 Parallel 活動的非真正多執行緒並行模型
  • 使用 SynchronizationScope 解決共享資料存取與臨界區問題
  • 運用 ConditionedActivityGroup (CAG) 實作條件驅動的並行排程

Parallel 活動:偽並行與執行模型

Parallel 是組合活動,僅接受 Sequence 子活動(至少兩個)。**子活動不在獨立執行緒**,WF 在單一執行緒上輪流執行各分支的單一活動單元(原子活動完成前不切換)。執行順序看似隨機實為確定性(左→右、上→下),**但業務邏輯必須假設真隨機並行**。

Delay 活動僅阻塞所在分支,其他分支持續執行。

SynchronizationScope:同步處理利器

問題場景

並行分支共享變數 _msg 輸出「Hello, World!」與「The quick brown fox...」導致字串交錯。

解決方案

將每分支的輸出代碼包裹在 SynchronizationScope 中,設定相同 SynchronizationHandles = "SyncLock"。機制類似 Mutex:同一 Handle 的 Scope 同一時間僅有一個可進入,強制臨界區原子執行,確保輸出順序完整。

// 左分支
_msg = "Hello, "; PrintMessage();
_msg = " World!\n"; PrintMessage();

// 右分支
_msg = "The quick brown fox"; PrintMessage();
_msg = " jumps over the lazy dog.\n"; PrintMessage();

執行後輸出不再交錯,證明同步有效。

ConditionedActivityGroup (CAG):條件驅動並行排程器

核心概念

  • UntilCondition:全域終止條件,true 結束 CAG
  • WhenCondition:每個子活動的啟用條件,滿足才執行
  • 子活動並行執行,完成後重新評估 Until/When 條件
  • 設計器支援「編輯/預覽」雙模式,子活動僅限單一活動(複雜邏輯用 Sequence 包裝)

適用場景:儲罐液位監控 (TankMonitor)

四個自定義子活動:

  1. SetLevel:WhenCondition=AlwaysExecute,綁定 TankLevel 屬性,Invoked 重置通知旗標
  2. Stop:WhenCondition=AlwaysExecute,Invoked 設定 _stop=true 觸發 UntilCondition
  3. UnderfillAlert:WhenCondition=CheckEmpty(液位 ≤ 下限且未通知過),綁定 TankLevel
  4. OverfillRelease:WhenCondition=CheckOverfill(液位 ≥ 上限且未通知過),綁定 TankLevel

UntilCondition=CheckContinue 返回 _stop。滑桿調整液位,UI 即時顯示「低液位警告」或「高液位釋放」,且同一狀態僅通知一次。

CAG 進階優勢

若用 While+IfElse 實現需大量巢狀活動,CAG 以聲明式條件簡化邏輯,且天然支援並行子活動獨立排程。**當順序工作流需要狀態機式的條件觸發行為時,CAG 是輕量替代方案**,無需建立獨立 State Machine 工作流。

總結

  • Parallel:簡單並行,無共享資料時首選
  • SynchronizationScope:共享資料/臨界區同步,Handle 機制輕量易用
  • CAG:複雜條件驅動並行排程,適合監控、輪詢、多條件觸發場景
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved