以下是我的工作流程实现概述:
- 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();
}
这样做的原因是我需要知道特定工作流实例何时终止或出错。问题是它会导致我的应用程序出现巨大的内存泄漏,如在这里SO上所述。
如果我使用using关键字,甚至如果我调用Dispose并将workflow_runtime引用设置为null,我都会遇到严重的内存泄漏问题。然而,如果我将工作流运行时实现为单例模式,如此帖子中所述,内存使用率非常低且稳定。我可以通过图表中的闪烁看到工作流何时启动和完成。
问题是,如果我为WF运行时使用单例模式,我如何知道特定工作流是否出错?如果我只是注册事件处理程序,当任何一个工作流终止或完成时,不是所有事件处理程序都会被调用吗?
编辑:我应该只是在堆栈上使用另一个句柄来处理错误,然后等待其中一个被设置,然后检查哪一个被设置?我以前应该考虑过这个问题。