這個特殊的問題讓我感到非常緊張。我想知道有沒有人遇到類似的問題。如果我加載一個工作流然後卸載它並執行內存快照,那麼結果是可預測的 - 我的工作流不再在內存中。但是,如果我加載工作流並將PersistableIdle操作設置爲PersistableIdleAction.Unload,並讓工作流處於空閒狀態,則即使Unload操作觸發,工作流也會保留在內存中。使用Workflow 4.0時出現內存泄露SqlWorkflowInstanceStore和PersistableIdleAction.Unload
我使用了ANTS Memory Profiler來調試此問題。這是輸出的對象保留圖表,顯示內部對象掛在我的工作流實例上。
alt text http://www.rohland.co.za/wp-content/uploads/2010/04/Workflow_retention_graph.png
可誰都驗證這個問題?我的代碼量以下幾點:
- 創建SqlWorkflowInstanceStore和設置鎖的擁有者處理
- 在這一點上我需要一個內存快照 - 創建Workflow1
- 的實例設置PersistableIdle行動
- 將實例存儲應用於Workflow1
- 針對空閒,卸載,未處理異常等設置操作事件處理程序
- 堅持工作流實例Ë
- 運行工作流實例
- 等待例如空閒(因延誤活動)
- 確保卸載動作射擊
- 在這一點上,我採取了第二個內存快照
從上面的圖片中可以清楚地看出,引用Workflow1的唯一對象是一些內部事件處理程序,我無法處理這些事件處理程序。
任何線索?
如果您想重現此行爲,請打開以下WCF和WF示例庫從Microsoft-WF \ Basic \ Execution \ ControllingWorkflowApplications \ CS提供的示例。如果我打開應用程序並運行大量工作流程實例,但內存不會被釋放。 – Rohland 2010-04-29 10:49:16