2012-02-09 69 views
0

我目前正在將WorkFlowServiceHost與開箱即用的SqlWorkflowInstanceStore結合使用以實現持久性目的。 我需要知道什麼時候一個完成的工作流實例實際上已經在數據庫中持久存在,也就是說,在[System.Activities.DurableInstancing] .InstancesTable中的相關行已更新爲iscompleted = 1之後,需要立即通知我有從trackingparticipant類繼承,並重寫TRACK方法。確定何時保存完成的工作流實例

然後我做了以下新增個人資料..

Dim instanceQuery As New WorkflowInstanceQuery 
    instanceQuery.States.Add(WorkflowInstanceStates.Completed) 

    Dim runCompletedTrackingProfile As New TrackingProfile 
    runCompletedTrackingProfile.Name = "runCompletedTrackingProfile" 
    runCompletedTrackingProfile.Queries.Add(instanceQuery) 

    Dim trackingParticipant As New RunCompletedTrackingParticipant With {.TrackingProfile = runCompletedTrackingProfile} 

    _CommPayRunWorkFlowServiceHost.WorkflowExtensions.Add(trackingParticipant) 

這一切工作正常,如果我把一個斷點在我TrackingParticipant類會在預期的時間被擊中。然而,在這一點上,雖然內存中的工作流實例是COMPLETED,但數據庫尚未更新。 我認爲這是因爲持久性代碼在同一個線程上運行,因爲如果我在跟蹤參與者 內啓動另一個線程,則可以看到「iscompleted」字段會更新。

什麼是最優雅的方式來實現這一點,而不是連續輪詢數據庫?我已經看了實例存儲上的.WaitForEvents方法,但這看起來並沒有做到我所需要的。

回答

1

由於I/O是異步完成的,任何設計都要求您這樣做,脆弱的代碼。你爲什麼想這樣做?

+0

Ron在這裏是百分之百的 - 永遠不會知道他運行WF程序的事實:) - 任何你堅持的東西,這可能是MSSQL服務器在你的情況下,我猜,會拋出錯誤,如果它不會持續。但是,如果需要關於持久性或完成的通知,請構建一個自定義活動,在發生這些情況時發送該通知。這應該是非常簡單的。如果您需要一些幫助,請告訴我們,但我們需要更多關於您的需求的信息。 – 2012-02-19 01:39:08

+0

請參閱以下內容以瞭解正在進行的操作:http://social.msdn.microsoft.com/Forums/ar-SA/wfprerelease/thread/8cd8a42c-17dd-43e3-a405-367feb4d75cd – 2012-02-23 01:51:31

+0

In特別是,請參閱我的關於需要關閉我的workflowservicehost的註釋,爲了關聯目的使用新的guid重新配置它,然後在實例完成後重新打開它。作爲這個過程的一部分,我需要查詢實例存儲。只是爲了重申,這是我感興趣的實際持久性本身,而不僅僅是知道MEMORY中的實例是完整的 – 2012-02-23 02:03:13

相關問題