C# 为什么';工作流是否在卸载后唤醒? 我试图更好地理解.NET工作流基础,尤其是持久/卸载和恢复功能如何工作。

C# 为什么';工作流是否在卸载后唤醒? 我试图更好地理解.NET工作流基础,尤其是持久/卸载和恢复功能如何工作。,c#,.net,workflow,workflow-foundation,workflow-foundation-4.5,C#,.net,Workflow,Workflow Foundation,Workflow Foundation 4.5,因此,出于测试目的,我创建了一个非常简单的活动,并尝试将其托管在WorkflowApplication中。我想学习如何在工作流实例空闲时使用持久化工作流实例的功能。因此,我编写了以下代码: var store = new SqlWorkflowInstanceStore("......"); var identity = new WorkflowIdentity("MyAwesomeWorkflow", Version.Parse("1.0"), String.Empty); var activ

因此,出于测试目的,我创建了一个非常简单的活动,并尝试将其托管在
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();
延迟
活动开始时,工作流被卸载,但当
延迟
结束时,工作流不会恢复。我不是工作流基础专家,所以我意识到我必须正确地使用API。据我的同事们说,当
延迟
结束时,工作流应该自动唤醒并恢复执行


我已经读过这个话题,但它似乎并没有很好地解释这一方面。

与此同时,我已经明白了这一点。既然没有人给出答案,我就把它贴在这里,以防万一有人在寻找解决方案

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

所以你可以:

  • 手动轮询实例存储数据库,并在适当时恢复工作流实例
  • 使用
    WorkflowServiceHost
    ,它在引擎盖下实现相同的轮询

WorkflowApplication(与服务主机不同)不会为您恢复卸载的工作流-您必须手动执行该操作。@Evk您能再详细说明一下吗?我不确定我能告诉您更多。使用WorkflowServiceHost时,它可以为您恢复卸载的工作流。WorkflowApplication不能,所以您的示例按预期工作,您这边没有问题,但您可以自己做。卸载时,工作流及其下一次运行时将持久化到数据库。因此,通过轮询该数据库,您可以确定哪些工作流已准备好恢复并加载它们。SqlWorkflowInstanceStore(WaitForEvents或类似的东西)中对此有支持。