Мы использовали шаблон Factory/Singlton для создания среды выполнения рабочего процесса.
Когда мы запускаем рабочий процесс, мы используем AutoResetEvent waitHandle.WaitOne(), чтобы дождаться завершения рабочего процесса.
Если два рабочих процесса выполняются одновременно, они реагируют на одно и то же событие AutoResetEvent, и оба вызова получают возвращаемые значения, предназначенные для первого вызова.
Есть ли способ исправить это, не создавая новую среду выполнения рабочего процесса для каждого вызова?
Спасибо
Шираз
ИЗМЕНИТЬ
Вот упрощенная версия кода:
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
}
}