2012-09-17 30 views
1

I ve been searching a good simple sample for WF4 (or higher) state machine with resume (possibly BookMarks from the docs I已閱讀)。 我想看看如何實現一個狀態機,它能夠在WF內的任何給定狀態下恢復。 由於我對WF一無所知,我希望看到一個簡單的狀態機,我可以在上次狀態恢復狀態,同時也很高興看到如何「強制」WF跳轉到一個州並從那裏重新開始(如果可能的話)。 Thansk很多。WF4狀態機+書籤

回答

0

嘗試臨WF 4.5書的章節。 4個狀態機的例子。即使你沒有這本書,你也可以從the Apress' book site下載示例源代碼。

1

你需要實現自定義的活動是這樣的:

public sealed class WaitForBookmark : NativeActivity 
{ 
    [RequiredArgument] 
    public InArgument<String> BookmarkName { get; set; } 

    protected override void Execute(NativeActivityContext context) 
    { 
     context.CreateBookmark(BookmarkName.Get(context)); 
    } 

    protected override bool CanInduceIdle 
    { 
     get { return true; } 
    } 
} 

將這個活動的狀態中。在您需要恢復每個書籤之後。

0

狀態機根據傳入的數據跳轉/跳過某些狀態時,恢復書籤聽起來像是實際上只是一個具有條件轉換的狀態機。

你的轉換可以像你想要的那樣複雜,如果你傾向於這樣(它聽起來像你所要求的),它們可能是完全連通的圖。但是如果你有很多狀態,這可能會很快成爲一個噩夢,並且可能需要所有轉換條件。

在你做這樣的事情之前,你可能想看看微軟的How to Choose Your Workflow Model in WF,也許仔細考慮一下你應該建模什麼樣的狀態,以及什麼可能適合做一個變量。


要回答你的問題如何做到這一點:

大廈關閉的MSDN example on building a bookmark activity可以接受恢復參數爲包含你需要決定去哪裏的信息的字符串或對象在你的轉變。

public sealed class StateSelectorActivity : NativeActivity 
{ 
    // Define an activity input argument of type string 
    [RequiredArgument] 
    public InArgument<string> BookmarkName { get; set; } 
    public OutArgument<string> NextState { get; set; } 

    protected override void Execute(NativeActivityContext context) 
    { 
     context.CreateBookmark(BookmarkName.Get(context), new BookmarkCallback(OnResumeBookmark)); 
    } 

    protected override bool CanInduceIdle { get { return true; } } 

    public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj) 
    { 
     StateSelectorArguments args = obj as StateSelectorArguments; 
     if (args != null) 
     { 
      this.NextState.Set(context, args.NextState); 
     } 
    } 
} 

public class StateSelectorArguments 
{ 
    public string NextState { get; set; } 
    // ... Whatever else you want to pass in 
} 

因此,可以轉到任何在任何時候狀態可能有一個使用的輸入參數來告訴它「將startState」來轉到一個初始化狀態一的StateMachine工作流程。

然後,每個中間狀態可以與Trigger一起進行單一轉換,如上面的活動,設置一個「NextState」局部變量,轉換條件可以使用該局部變量來確定下一個轉到哪個狀態。

以這種方式使用StateMachine的一個極端例子可能是:如果您有一個StateMachine「ChessBoard」和一個名爲「White Queen」的實例,其當前狀態爲「e4」,則您的簡歷書籤調用可能需要一個參數「e5」並接受將「白皇后」移動到國家「e5」。