gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:31:54 24 4
gpt4 key购买 nike

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

  • 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,我也会发生大量内存泄漏。但是,如果我将工作流运行时实现为单例,as described in this post ,内存使用率非常低且一致。我可以通过图表中的光点看到工作流何时启动和完成。

问题是,如果我为 WF 运行时使用单例模式,我如何知道特定工作流何时出现错误?如果我只注册事件处理程序,当任何工作流终止或完成时,不会调用所有它们吗?

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

最佳答案

所以这就是我决定如何解决这个问题。如果我的解决方案有问题,请发表评论,如果正确的话,我会标记其他人的答案。

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

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

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

关于Windows 工作流运行时泄漏大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2051429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com