无需"持久性服务"即可管理工作流生命周期

Dav*_*ave 1 .net workflow workflow-foundation

我现在正在使用Windows WF来简单地说明状态机.事实上,我甚至没有使用状态机,我正在使用顺序工作流程.最终,我会抛弃WF而不是其他东西,但由于我已经有了代码,我需要让Abort,Suspend和Resume方法正常工作.

我的应用程序生成一个线程,然后生成另一个拥有WorkflowInstance的线程.我的GUI中有Abort,Pause和Resume按钮,它们最终分别调用WorkflowInstance的Abort,Suspend和Resume方法.

问题是当我这样做时,我得到一个非常大且可怕的MessageBox,它说:

工作流托管环境没有工作流实例上的操作所需的持久性服务

以及一个很好的堆栈跟踪和所有.现在,我在Bruce Bukovics的Pro WF中查找了这些方法,他的一个例子称这些方法,并没有提到"持久性服务".但是,他的示例调用属于WorkflowRuntime的范围,即他将它们调用为:

using(WorkflowRuntimeManager manager = new WorkflowRuntimeManager(new WorkflowRuntime("WorkflowRuntime")))
{
  manager.WorkflowRuntime.StartRuntime();
  WorkflowInstanceWrapper instance = manager.StartWorkflow(typeof(SharedWorkflows.Workflow1), null);
  instance.Suspend("Manually suspended");
  instance.Resume();
  waitHandle.WaitOne();
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我将WorkflowRuntime实现为单例,因为我发现在创建像这样的WorkflowRuntime时存在巨大的内存泄漏.所以我的代码看起来像这样:

WorkflowInstance instance = WorkflowRuntimeSingleton.Instance.workflow_runtime.CreateWorkflow(typeof(SharedWorkflows.Workflow1), null);
instance.Start();
instance.Suspend("Manually suspended");
instance.Resume();
waitHandle.WaitOne();
Run Code Online (Sandbox Code Playgroud)

现在,如果我如上所示调用Suspend and Resume,它可以正常工作.但是,如果我通过GUI发出调用,它会抱怨持久性服务.

鉴于这些信息,并且我不想仅仅为了获得这三个功能而建立数据库,我想知道我需要做些什么来使这项工作.我最好的猜测是,WF不喜欢从一个单独的线程控制.如果是这种情况,是否有一种好方法可以使调用看起来好像是从同一个线程发出的?

以下是我提出的一些可能的解决方案,但我确信这里的某个人有更好的方式来做到这一点.

  1. WF通过GUI界面查询中止/暂停/恢复(看起来真的很蹩脚)
  2. 用WaitAny()替换WaitOne(),并将GUI调用到拥有工作流的对象中设置AutoResetEvent.WaitAny()允许继续执行,然后我的代码可以检查用户按下哪个按钮.这需要包装在一个循环中,以便我们可以再次等待,直到用户单击Abort,或直到WF完成.
  3. 使用布尔标志基本上做#2正在做的事情.
  4. 看看SO上是否有人知道如何让电话神奇地进入正确的线程:)

任何见解或意见将非常感谢!

Gab*_*ams 5

创建持久性数据库并不是什么大不了的事.实际上,它会帮助您解决内存问题,因为它会暂停超过给定时间段(暂停内存)的工作流.这是一个帮助您创建数据库并在工作流程中使用它的链接:http: //msdn.microsoft.com/en-us/library/ms735722(VS.85).aspx

在链接中,它提到更改您的app.config.我没有这样做.相反,我在代码中添加了服务.像这样:

//Add the persistence service
WorkflowPersistenceService persistenceService = new SqlWorkflowPersistenceService(
    DBConnections.PersistenceService,
    true,
    TimeSpan.MaxValue,
    new TimeSpan(0, 0, 15));
m_WorkflowRuntime.AddService(persistenceService);
Run Code Online (Sandbox Code Playgroud)

编辑: 另一个有用的链接