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不喜欢从一个单独的线程控制.如果是这种情况,是否有一种好方法可以使调用看起来好像是从同一个线程发出的?
以下是我提出的一些可能的解决方案,但我确信这里的某个人有更好的方式来做到这一点.
任何见解或意见将非常感谢!
创建持久性数据库并不是什么大不了的事.实际上,它会帮助您解决内存问题,因为它会暂停超过给定时间段(暂停内存)的工作流.这是一个帮助您创建数据库并在工作流程中使用它的链接: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)
编辑: 另一个有用的链接
| 归档时间: |
|
| 查看次数: |
2740 次 |
| 最近记录: |