C# Windows工作流运行时能否同时运行两个工作流
我们使用了Factory/Singlton模式来创建工作流运行时 运行工作流时,我们使用AutoResteEvent waitHandle.WaitOne()等待工作流完成 如果两个工作流同时运行,它们会对相同的AutoResetEvent做出反应,并且两个调用都会得到第一个调用的返回值 有没有一种方法可以在不为每次调用创建新的工作流运行时的情况下修复此问题 谢谢 设拉子 编辑 以下是代码的简化版本:C# Windows工作流运行时能否同时运行两个工作流,c#,singleton,workflow-foundation,C#,Singleton,Workflow Foundation,我们使用了Factory/Singlton模式来创建工作流运行时 运行工作流时,我们使用AutoResteEvent waitHandle.WaitOne()等待工作流完成 如果两个工作流同时运行,它们会对相同的AutoResetEvent做出反应,并且两个调用都会得到第一个调用的返回值 有没有一种方法可以在不为每次调用创建新的工作流运行时的情况下修复此问题 谢谢 设拉子 编辑 以下是代码的简化版本: public class Process: IProcess { private Au
public class Process: IProcess
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
/// <summary>
/// ReturnValues
/// </summary>
private Dictionary<string, object> ReturnValues;
public ProcessCargo Preprocess(ProcessorCargo cargo)
{
try
{
WorkflowRuntime workflowRuntime = WorkflowFactory.GetWorkflowRuntime();
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(workflowCompleted);
workflowRuntime.WorkflowTerminated += new EventHandler<WorkflowTerminatedEventArgs>(workflowTerminated);
workflowRuntime.ServicesExceptionNotHandled += new EventHandler<ServicesExceptionNotHandledEventArgs>(workflowRuntime_ServicesExceptionNotHandled);
Dictionary<string, object> parameters = new Dictionary<string, object>();
// Add Parameters
WorkflowInstance workflowInstance;
workflowInstance = workflowRuntime.CreateWorkflow(typeof(ProcessWorkflow), parameters);
workflowInstance.Start();
waitHandle.WaitOne();
cargo.A = (A)ReturnValues[KeyA];
}
catch (Exception e)
{
LoggingHelper.LogFault(e);
throw;
}
return cargo;
}
公共类进程:i进程
{
私有自动恢复事件waitHandle=新自动恢复事件(false);
///
///返回值
///
个人价值观;
公共ProcessCargo预处理(ProcessorCargo货物)
{
尝试
{
WorkflowRuntime WorkflowRuntime=WorkflowFactory.GetWorkflowRuntime();
workflowRuntime.WorkflowCompleted+=新事件处理程序(WorkflowCompleted);
workflowRuntime.WorkflowTerminated+=新事件处理程序(WorkflowTerminated);
workflowRuntime.ServicesExceptionNotHandled+=新事件处理程序(workflowRuntime\u ServicesExceptionNotHandled);
字典参数=新字典();
//添加参数
WorkflowInstance WorkflowInstance;
workflowInstance=workflowRuntime.CreateWorkflow(typeof(ProcessWorkflow),参数);
workflowInstance.Start();
waitHandle.WaitOne();
cargo.A=(A)返回值[KeyA];
}
捕获(例外e)
{
LoggingHelper.LogFault(e);
投掷;
}
退货;
}
这里是工作流工厂,它是基于Windows工作流基础中的代码一步一步的书:
public static class WorkflowFactory
{
// Singleton instance of the workflow runtime
private static WorkflowRuntime _workflowRuntime = null;
// Lock (sync) object
private static object _syncRoot = new object();
/// <summary>
/// Factory method
/// </summary>
/// <returns></returns>
public static WorkflowRuntime GetWorkflowRuntime()
{
// Lock execution thread in case of multi-threaded
// (concurrent) access.
lock (_syncRoot)
{
// Check for startup condition
if (null == _workflowRuntime)
{
// Provide for shutdown
AppDomain.CurrentDomain.ProcessExit += new EventHandler(StopWorkflowRuntime);
AppDomain.CurrentDomain.DomainUnload += new EventHandler(StopWorkflowRuntime);
// Not started, so create instance
_workflowRuntime = new WorkflowRuntime();
// Start the runtime
_workflowRuntime.StartRuntime();
} // if
// Return singleton instance
return _workflowRuntime;
} // lock
}
// Shutdown method
static void StopWorkflowRuntime(object sender, EventArgs e)
{
if (_workflowRuntime != null)
{
if (_workflowRuntime.IsStarted)
{
try
{
// Stop the runtime
_workflowRuntime.StopRuntime();
}
catch (ObjectDisposedException)
{
// Already disposed of, so ignore...
} // catch
} // if
} // if
}
}
公共静态类WorkflowFactory
{
//工作流运行时的单例实例
私有静态WorkflowRuntime _WorkflowRuntime=null;
//锁定(同步)对象
私有静态对象_syncRoot=新对象();
///
///工厂法
///
///
公共静态WorkflowRuntime GetWorkflowRuntime()
{
//在多线程的情况下锁定执行线程
//(并发)访问。
锁定(\u syncRoot)
{
//检查启动条件
if(null==\u workflowRuntime)
{
//准备关闭
AppDomain.CurrentDomain.ProcessExit+=新事件处理程序(StopWorkflowRuntime);
AppDomain.CurrentDomain.DomainUnload+=新事件处理程序(StopWorkflowRuntime);
//没有启动,所以创建实例
_workflowRuntime=新的workflowRuntime();
//启动运行时
_workflowRuntime.StartRuntime();
}//如果
//返回单例实例
返回\u workflowRuntime;
}//锁
}
//关机方法
静态void StopWorkflowRuntime(对象发送方、事件参数e)
{
如果(_workflowRuntime!=null)
{
if(_workflowRuntime.IsStarted)
{
尝试
{
//停止运行时
_workflowRuntime.StopRuntime();
}
捕获(ObjectDisposedException)
{
//已经处理好了,所以忽略。。。
}//抓住
}//如果
}//如果
}
}
单个Windows工作流运行时可以同时运行多个工作流。您在运行时周围放置的代码需要修复
等待句柄上等待的是什么?为什么等待?为什么对多个工作流实例使用相同的句柄?感谢您的回答我已使用代码示例更新了我的问题哇,我发表了评论,然后意识到您的代码示例是针对您的解决方案,而不是您的问题。我将尝试一下!