代码之家  ›  专栏  ›  技术社区  ›  Dave

Windows工作流运行时泄漏大量内存

  •  3
  • Dave  · 技术社区  · 15 年前

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

    • 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并将工作流运行时引用设置为空,也会出现大量内存泄漏。但是,如果我将工作流运行时作为一个单例实现, as described in this post ,内存使用率非常低且一致。我可以在图中看到什么时候通过点启动和完成工作流。

    问题是,如果我在WF运行时使用singleton模式,我如何知道 具体的 工作流有错误?如果我只是注册事件处理程序,不会 全部的 他们中的一个当 任何 是否终止或完成了工作流?

    编辑:我应该只使用堆栈上的另一个句柄来处理错误,然后等待其中一个被设置,然后检查哪个被设置了?我以前应该考虑过。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Dave    15 年前

    下面是我如何决定解决这个问题的。如果我的解决方案有问题,请发表评论,如果答案正确,我将标记其他人的答案。

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

    我对singleton模式的一个问题是我不知道如何处理工作流的不同实例。结果是,我只需要检查通过事件参数传递的实例的instanceID,并确保它们匹配。这就是处理不同工作流事件的方式。

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