【发布时间】:2011-01-04 07:38:16
【问题描述】:
以下是我的工作流程实施概览:
- 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 运行时,我如何知道特定 工作流何时出现错误?如果我只是注册事件处理程序,当 任何 个工作流终止或完成时,它们中的 all 不会被调用吗?
编辑:我是否应该只使用堆栈上的另一个句柄来处理错误,然后等待其中一个被设置,然后检查哪个被设置?我之前应该考虑过的。
【问题讨论】:
-
您是否尝试过注销 WorkflowCompleted 和 WorkflowTerminated 事件?
-
您应该将其作为答案提交。我敢打赌,你只是一针见血。我一直在使用在网络上猖獗的工作流代码,但存在缺陷,因为它使用了一种阻止事件处理程序注销的方法!我现在就试一试,如果你把它贴在这里,我会把你的答案标记为答案。感谢您发现这个愚蠢的错误。
-
这篇文章不仅展示了取消注册处理程序的好方法,而且还向我展示了如何处理我的问题的另一部分——如何区分工作流! bit.ly/8pkEWT
-
我想我已经得出了结论。我注销了事件处理程序(我设置了断点以确认它正在发生),并且仍然存在内存泄漏。奇数。
标签: windows memory workflow runtime memory-leaks