为什么工作流在卸载后没有唤醒?



我试图更好地理解.NET工作流基础,尤其是持久/卸载和恢复功能的工作原理。

因此,出于测试目的,我创建了一个非常简单的活动,并尝试将其托管在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活动启动时卸载,但在Delay结束时不会恢复。我不是工作流基础专家,所以我意识到我一定是错误地使用了 API。根据我的同事的说法,工作流应该在Delay结束时自动唤醒并恢复执行。

我已经阅读了这篇关于该主题的 MSDN 文章,但它似乎没有很好地解释这方面。

与此同时,我已经想通了。由于没有人发布答案,我将在这里发布它,以防有人正在寻找解决方案。

基本上,工作流引擎不支持自动恢复工作流实例。这在某种程度上具有误导性,但WorkflowApplication不支持这一点。

因此,您可以:

  • 手动轮询实例存储数据库并在适当时恢复工作流实例
  • 使用在后台实现相同轮询的WorkflowServiceHost

最新更新