为什么Workflow卸载后不唤醒?
Why doesn't the Workflow wake up after being unloaded?
我试图更好地理解 .NET Workflow Foundation,尤其是持久/卸载和恢复功能的工作原理。
因此,出于测试目的,我创建了一个非常简单的 Activity 并尝试将其托管在 WorkflowApplication
中。我想了解如何使用在空闲时保留工作流实例的能力。所以我写了下面的代码:
var store = new SqlWorkflowInstanceStore("......");
var identity = new WorkflowIdentity("MyAwesomeWorkflow", Version.Parse("1.0"), String.Empty);
var activity = new Sequence()
{
Activities =
{
new WriteLine() {Text = "hello"},
new Delay() {Duration = TimeSpan.FromSeconds(5)},
new WriteLine() {Text = "bye"},
}
};
var wfapp = new WorkflowApplication(activity, identity);
var resetEvent = new ManualResetEventSlim();
wfapp.InstanceStore = store;
wfapp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
{
Console.WriteLine("Persistable idle");
return PersistableIdleAction.Unload;
};
wfapp.Completed += delegate(WorkflowApplicationCompletedEventArgs eventArgs)
{
Console.WriteLine("completed");
resetEvent.Set();
};
wfapp.Run();
resetEvent.Wait();
工作流在 Delay
Activity 开始时卸载,但在 Delay
结束时不会恢复。我不是 Workflow Foundation 专家,所以我意识到我一定是错误地使用了 API。据我的同事说,工作流应该在 Delay
结束时自动唤醒并恢复执行。
我已经阅读了关于该主题的 this MSDN article,但它似乎并没有很好地解释这方面。
同时我已经弄明白了。由于没有人 post 给出答案,我将 post 放在这里以防万一有人正在寻找解决方案。
工作流引擎基本上不支持工作流实例的自动恢复。这有点误导,但 WorkflowApplication
不支持这一点。
所以你可以:
- 手动轮询实例存储数据库并在适当时恢复工作流实例
- 使用
WorkflowServiceHost
在后台实现相同的轮询
我试图更好地理解 .NET Workflow Foundation,尤其是持久/卸载和恢复功能的工作原理。
因此,出于测试目的,我创建了一个非常简单的 Activity 并尝试将其托管在 WorkflowApplication
中。我想了解如何使用在空闲时保留工作流实例的能力。所以我写了下面的代码:
var store = new SqlWorkflowInstanceStore("......");
var identity = new WorkflowIdentity("MyAwesomeWorkflow", Version.Parse("1.0"), String.Empty);
var activity = new Sequence()
{
Activities =
{
new WriteLine() {Text = "hello"},
new Delay() {Duration = TimeSpan.FromSeconds(5)},
new WriteLine() {Text = "bye"},
}
};
var wfapp = new WorkflowApplication(activity, identity);
var resetEvent = new ManualResetEventSlim();
wfapp.InstanceStore = store;
wfapp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
{
Console.WriteLine("Persistable idle");
return PersistableIdleAction.Unload;
};
wfapp.Completed += delegate(WorkflowApplicationCompletedEventArgs eventArgs)
{
Console.WriteLine("completed");
resetEvent.Set();
};
wfapp.Run();
resetEvent.Wait();
工作流在 Delay
Activity 开始时卸载,但在 Delay
结束时不会恢复。我不是 Workflow Foundation 专家,所以我意识到我一定是错误地使用了 API。据我的同事说,工作流应该在 Delay
结束时自动唤醒并恢复执行。
我已经阅读了关于该主题的 this MSDN article,但它似乎并没有很好地解释这方面。
同时我已经弄明白了。由于没有人 post 给出答案,我将 post 放在这里以防万一有人正在寻找解决方案。
工作流引擎基本上不支持工作流实例的自动恢复。这有点误导,但 WorkflowApplication
不支持这一点。
所以你可以:
- 手动轮询实例存储数据库并在适当时恢复工作流实例
- 使用
WorkflowServiceHost
在后台实现相同的轮询