這是我的工作流程實現的概述: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模式,我將如何知道特定的工作流是否有錯誤?如果我只註冊事件處理程序,將不會全部被調用時任何的工作流程終止或完成?
編輯:我應該只是使用另一個堆棧上的句柄錯誤,然後等待要麼設置,然後檢查哪一個設置?我以前應該考慮過這一點。
您是否嘗試取消註冊WorkflowCompleted和WorkflowTerminated事件? – overslacked 2010-01-12 19:09:06
你應該提交這個答案。我敢打賭,你只是碰到了頭上的釘子。我一直在使用網絡上氾濫的工作流代碼,但有缺陷,它使用了一種防止註銷事件處理程序的方法!我現在就試試這個,如果你在這裏發佈它,你會將它標記爲答案。感謝您捕捉那個愚蠢的錯誤。 – Dave 2010-01-12 19:51:51
這篇文章不僅展示了註銷處理程序的好方法,而且還向我展示瞭如何處理我的問題的其他部分 - 如何區分工作流程! http://bit.ly/8pkEWT – Dave 2010-01-12 19:58:03