Windows Workflow Runtime泄漏了大量内存

时间:2010-01-12 18:40:46

标签: windows memory workflow runtime memory-leaks

以下是我的工作流程实施概述:

  • 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,则内存使用率非常低且一致。我可以看到工作流程何时通过图表中的blip启动和完成。

问题是,如果我对WF运行时使用Singleton模式,我怎么知道特定的工作流何时出错?如果我只是注册事件处理程序,当任何工作流终止或完成时,所有都不会被调用吗?

编辑:我应该在堆栈上使用另一个句柄来查找错误,然后等待设置,然后检查哪一个设置了?我之前应该考虑过这个问题。

1 个答案:

答案 0 :(得分:2)

所以这就是我决定解决问题的方法。如果我的解决方案出现问题,请发表评论,如果正确,我会标记别人的答案。

我在上一篇文章中更改了代码以取消注册事件处理程序,并通过设置断点确认代码正在执行。运行应用程序后,它仍然泄漏1.5GB。

我对Singleton模式的一个问题是我不知道如何处理工作流的不同实例。事实证明,我只需检查通过事件args传递的实例的InstanceID,并确保它们匹配。这就是您处理不同工作流事件的方式。

我从http://bit.ly/8pkEWT实现了Singleton模式,此外,取消注册了事件处理程序并处理了InstanceID。内存泄漏消失了!但是,我还没有验证每个工作流程的结果。 (让人惊讶)