2010-01-12 29 views
3

這是我的工作流程實現的概述:Windows工作流運行時泄漏一噸的內存

  • GUI線程開始工作線程
  • 工作線程分析一些數據
  • 工作者線程開始其他幾個工作線程工作在 數據
  • 的子集,這些最後的工作線程的創建工作流運行時和 執行順序工作流

到現在爲止,我已經在每個線程創建一個新的WorkflowRuntime對象是這樣的:

using(WorkflowRuntime workflow_runtime = new WorkflowRuntime()) { 
     AutoResetEvent waitHandle = new AutoResetEvent(false); 
     workflow_runtime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();}; 
     workflow_runtime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) 
     { 
      Console.WriteLine(e.Exception.Message); 
      waitHandle.Set(); 
     }; 

     WorkflowInstance instance = workflow_runtime.CreateWorkflow(typeof(MyWorkflow), parameters); 
     instance.Start(); 
     waitHandle.WaitOne(); 
} 

之所以做這種方式是,我需要知道什麼時候一個特定的工作流實例已終止或出錯。問題在於它會在我的應用程序中導致巨大的內存泄漏,如here on SO所述。

如果我使用using關鍵字,或者即使我調用Dispose並將workflow_runtime引用設置爲null,也會發生大量內存泄漏。但是,如果我作爲Singleton實現工作流運行時,as described in this post,內存使用率非常低且一致。我可以看到何時啓動工作流程並通過圖表中的點擊完成。

問題是,如果我爲WF運行時使用Singleton模式,我將如何知道特定的工作流是否有錯誤?如果我只註冊事件處理程序,將不會全部被調用時任何的工作流程終止或完成?

編輯:我應該只是使用另一個堆棧上的句柄錯誤,然後等待要麼設置,然後檢查哪一個設置?我以前應該考慮過這一點。

+1

您是否嘗試取消註冊WorkflowCompleted和WorkflowTerminated事件? – overslacked 2010-01-12 19:09:06

+0

你應該提交這個答案。我敢打賭,你只是碰到了頭上的釘子。我一直在使用網絡上氾濫的工作流代碼,但有缺陷,它使用了一種防止註銷事件處理程序的方法!我現在就試試這個,如果你在這裏發佈它,你會將它標記爲答案。感謝您捕捉那個愚蠢的錯誤。 – Dave 2010-01-12 19:51:51

+0

這篇文章不僅展示了註銷處理程序的好方法,而且還向我展示瞭如何處理我的問題的其他部分 - 如何區分工作流程! http://bit.ly/8pkEWT – Dave 2010-01-12 19:58:03

回答

2

所以這裏是我決定解決問題的方法。如果我的解決方案出現問題,請發表評論,如果正確,我會標記別人的回答。

我更改了代碼以取消註冊我以前的帖子中的事件處理程序,並通過設置斷點確認代碼正在執行。運行應用程序後,它仍然泄漏1.5GB。

Singleton模式的一個問題是我不知道如何處理工作流的不同實例。事實證明,我只需檢查通過事件參數傳遞的InstanceID,並確保它們匹配。這就是你處理不同的工作流事件的方式。

我實現了從http://bit.ly/8pkEWT的單例模式,此外,未註冊事件處理程序並處理InstanceID。內存泄漏消失了!但是,我還沒有開始驗證每個工作流程的結果。 (yikes)