c# - 为什么Workflow卸载后不唤醒?

标签 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 Activity 开始时,工作流被卸载,但当 Delay 结束时,它不会恢复。我不是 Workflow Foundation 专家,所以我意识到我一定是错误地使用了 API。根据我的同事的说法,工作流应该在 Delay 结束时自动唤醒并恢复执行。

我读过 this MSDN article关于这个话题,但它似乎并没有很好地解释这方面。

最佳答案

与此同时,我已经弄明白了。由于没有人发布答案,我将其发布在这里以防万一有人正在寻找解决方案。

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

所以你可以:

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

关于c# - 为什么Workflow卸载后不唤醒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44801398/

相关文章:

c# - 我应该用 LINQ 替换这些嵌套的 foreach 循环吗?如何替换?

c# - 企业库管理连接

xcode - 为什么 Xcode 5 助手编辑器默认为 .m 文件

c# - 从 C# 驱动程序建立多个快速连接时,服务器发送了无效的随机数

c# - 将二维数组转换为连续排列的行项目的一维列表

c# - 数学题 : Determine the corner radius of an inner border based on outer corner radius/thickness

c# - IAsyncEnumerable<T> 与 IEnumerable<Task<T>> 之间有什么区别?

C#线程不会休眠?

debugging - 如何: debug Scala code when outside of an IDE

database - 适用于所有开发人员的 WordPress 多站点和单一数据库