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

时间:2017-06-28 11:40:50

标签: c# .net workflow workflow-foundation workflow-foundation-4.5

我正在尝试更好地理解.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活动开始时卸载工作流,但在Delay结束时不会恢复。我不是Workflow Foundation的专家,因此我意识到我必须错误地使用API​​。根据我的同事们的说法,当Delay结束时,工作流程应自动唤醒并恢复执行。

我在这个主题上看过this MSDN article,但它似乎没有很好地解释这方面。

1 个答案:

答案 0 :(得分:3)

与此同时,我已经明白了。由于没有人发布答案,我会在这里发布,以防有​​人在寻找解决方案。

基本上,工作流引擎不支持自动恢复工作流实例。这有点误导,但WorkflowApplication不支持这一点。

所以你可以:

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