Мы использовали шаблон Factory/Singlton для создания рабочей среды рабочего процесса.Может ли Windows Workflow Runtime одновременно запускать 2 рабочих процесса
Когда мы запускаем рабочий процесс, мы используем AutoResetEvent waitHandle.WaitOne(), чтобы дождаться завершения рабочего процесса.
Если два рабочих процесса работают одновременно, они реагируют на один и тот же AutoResetEvent, и оба вызова получают возвращаемые значения, предназначенные для первого вызова.
Есть ли способ исправить это, не создавая новую рабочую среду рабочего процесса для каждого вызова?
Благодаря
Шираз
EDIT
Вот упрощенная версия кода:
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;
}
Вот рабочего процесса завода, он основан на коде в Windows Workflow Foundation Пошаговая книга:
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
}
}
Показать нам код? – AnthonyWJones
Упс, я отправил комментарий, а затем понял, что ваш образец кода был для вашего * решения *, а не вашей проблемы. Я попробую! – Dave