【问题标题】:Windows Workflow Runtime leaks a ton of memoryWindows 工作流运行时泄漏大量内存
【发布时间】: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


【解决方案1】:

这就是我决定解决问题的方法。如果我的解决方案有问题,请发布 cmets,如果正确,我将标记其他人的答案。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-02
    • 2015-03-07
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2014-05-03
    相关资源
    最近更新 更多