我打算使用Windows Workflow的State Machine WorkFlow。Windows上的StateMachine WorkFlow線程安全嗎?
狀態機將根據其當前狀態,並且排在了事件是由兩個獨立的線程接收事件,當然狀態機都將改變其狀態和執行動作。
我的問題是,是windows工作流的狀態機線程安全,這意味着當兩個線程同時訪問它時,它將保證正確的狀態改變?
我打算使用Windows Workflow的State Machine WorkFlow。Windows上的StateMachine WorkFlow線程安全嗎?
狀態機將根據其當前狀態,並且排在了事件是由兩個獨立的線程接收事件,當然狀態機都將改變其狀態和執行動作。
我的問題是,是windows工作流的狀態機線程安全,這意味着當兩個線程同時訪問它時,它將保證正確的狀態改變?
工作流程執行遵循單線程單元約定 - 也就是說,工作流程的一個特定實例只能由任何運行時中的一個線程執行。這是設計。
工作流運行時使用內部調度隊列來執行工作流實例的操作,因此調用同一工作流實例上的操作的兩個線程將首先序列化到調度器隊列,然後按順序調用由調度的新線程運行時(默認調度)或由調用上下文爲每個操作捐贈的線程(手動調度)。
當使用持久性服務時,工作流運行時還確保數據庫版本同步 - 另一個流程/機器上運行的另一個工作流運行時不能從持久性加載工作流實例,前提是當前由另一個工作流運行時。
這意味着您不必關心在工作流模型中執行的代碼的線程安全性(例如,您不必鎖定屬性設置器),而且您不必關心比賽條件。
什麼是你的這種事情在微軟文檔的解釋了(比如)State Activity CLass在System.Workflow.Activitie:
線程安全 任何公共靜態成員(在Visual Basic中的Shared)這種類型是線程 安全。任何實例成員不是 保證是線程安全的。
在許多相關類中給出了相似的段落。我的推論是「不」,對於您打算使用的用途來說不是線程安全的。
我不確定這將適用於Windows WorkFlow。 由於Windows WorkFlow上的許多操作都是爲您完成的,它的行爲更像是一個框架,而不僅僅是您操作的類。 – aattia 2009-08-06 21:52:36
這些明確的文檔的Windows工作流的類。如果您正在調用API,則需要關注線程安全性 - 我發現的文檔看起來很明顯。我認爲這是合理的,假設Windows Workflow的框架方面本身將它正確地進行並在需要的地方進行同步。如果您向我們展示您的設計在何處關注此問題,可能會有所幫助。 – djna 2009-08-07 06:55:51