以下是我的工作流程实施概述:
到目前为止,我一直在每个线程中创建一个新的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模式,我怎么知道特定的工作流何时出错?如果我只是注册事件处理程序,当任何工作流终止或完成时,所有都不会被调用吗?
编辑:我应该在堆栈上使用另一个句柄来查找错误,然后等待设置,然后检查哪一个设置了?我之前应该考虑过这个问题。
答案 0 :(得分:2)
所以这就是我决定解决问题的方法。如果我的解决方案出现问题,请发表评论,如果正确,我会标记别人的答案。
我在上一篇文章中更改了代码以取消注册事件处理程序,并通过设置断点确认代码正在执行。运行应用程序后,它仍然泄漏1.5GB。
我对Singleton模式的一个问题是我不知道如何处理工作流的不同实例。事实证明,我只需检查通过事件args传递的实例的InstanceID,并确保它们匹配。这就是您处理不同工作流事件的方式。
我从http://bit.ly/8pkEWT实现了Singleton模式,此外,取消注册了事件处理程序并处理了InstanceID。内存泄漏消失了!但是,我还没有验证每个工作流程的结果。 (让人惊讶)