这个特殊的问题让我发疯。我想知道是否有人遇到过类似的问题。如果我加载一个工作流然后卸载它并执行内存快照,那么结果是可以预测的——我的工作流不再在内存中。但是,如果我加载工作流并将 PersistableIdle 操作设置为 PersistableIdleAction.Unload 并让工作流空闲,即使 Unload 操作触发,工作流仍保留在内存中。
我使用 ANTS Memory Profiler 来调试这个问题。这是输出的对象保留图,显示内部对象挂在我的工作流实例上。
(来源:rohland.co.za)
其他人可以验证这个问题吗?我的代码如下:
- 创建 SqlWorkflowInstanceStore 并设置锁所有者句柄
——此时我拍摄内存快照 - 创建 Workflow1 的实例
- 设置 PersistableIdle 操作
- 将 instancestore 应用到 Workflow1
- 为 Idle、Unload、UnhandledException 等设置操作事件处理程序。
- 持久化工作流实例
- 运行工作流实例
- 等待实例空闲(由延迟活动引起)
- 确保触发了 Unload 操作
——此时我拍摄了第二个内存快照
从上图中可以清楚地看出,唯一引用 Workflow1 的对象是一些我无法处理的内部事件处理程序结果。
有什么线索吗?