103 lines
4.4 KiB
C#
103 lines
4.4 KiB
C#
|
//------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//------------------------------------------------------------
|
||
|
namespace System.ServiceModel.Dispatcher
|
||
|
{
|
||
|
using System.Workflow.Runtime;
|
||
|
using System.Runtime.Diagnostics;
|
||
|
using System.ServiceModel.Diagnostics;
|
||
|
using System.Diagnostics;
|
||
|
|
||
|
class WorkflowDurableInstance : DurableInstance
|
||
|
{
|
||
|
WorkflowOperationAsyncResult currentOperationInvocation;
|
||
|
WorkflowInstanceContextProvider instanceContextProvider;
|
||
|
bool shouldCreateNew = false;
|
||
|
object thisLock = new object();
|
||
|
WorkflowDefinitionContext workflowDefinition;
|
||
|
WorkflowInstance workflowInstance = null;
|
||
|
|
||
|
public WorkflowDurableInstance(WorkflowInstanceContextProvider instanceContextProvider, Guid instanceId, WorkflowDefinitionContext workflowDefinition, bool createNew)
|
||
|
:
|
||
|
base(instanceContextProvider, instanceId)
|
||
|
{
|
||
|
if (workflowDefinition == null)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("workflowDefinition");
|
||
|
}
|
||
|
|
||
|
this.workflowDefinition = workflowDefinition;
|
||
|
this.shouldCreateNew = createNew;
|
||
|
this.instanceContextProvider = instanceContextProvider;
|
||
|
}
|
||
|
|
||
|
public WorkflowOperationAsyncResult CurrentOperationInvocation
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.currentOperationInvocation;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
this.currentOperationInvocation = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public WorkflowInstance GetWorkflowInstance(bool canCreateInstance)
|
||
|
{
|
||
|
if (this.workflowInstance == null)
|
||
|
{
|
||
|
lock (thisLock)
|
||
|
{
|
||
|
if (shouldCreateNew)
|
||
|
{
|
||
|
if (canCreateInstance)
|
||
|
{
|
||
|
this.workflowInstance = this.workflowDefinition.CreateWorkflow(this.InstanceId);
|
||
|
shouldCreateNew = false;
|
||
|
|
||
|
if (DiagnosticUtility.ShouldTraceInformation)
|
||
|
{
|
||
|
string traceText = SR.GetString(SR.TraceCodeWorkflowDurableInstanceActivated, InstanceId);
|
||
|
TraceUtility.TraceEvent(TraceEventType.Information,
|
||
|
TraceCode.WorkflowDurableInstanceActivated, traceText,
|
||
|
new StringTraceRecord("DurableInstanceDetail", traceText),
|
||
|
this, null);
|
||
|
}
|
||
|
using (new WorkflowDispatchContext(true, true))
|
||
|
{
|
||
|
this.workflowInstance.Start();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//Make sure we clean up this InstanceContext;
|
||
|
DurableErrorHandler.CleanUpInstanceContextAtOperationCompletion();
|
||
|
//Inform InstanceLifeTimeManager to clean up record for InstanceId;
|
||
|
if (this.instanceContextProvider.InstanceLifeTimeManager != null)
|
||
|
{
|
||
|
this.instanceContextProvider.InstanceLifeTimeManager.CleanUp(this.InstanceId);
|
||
|
}
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new FaultException(new DurableDispatcherAddressingFault()));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.workflowInstance = this.workflowDefinition.WorkflowRuntime.GetWorkflow(InstanceId);
|
||
|
|
||
|
if (DiagnosticUtility.ShouldTraceInformation)
|
||
|
{
|
||
|
string traceText = SR.GetString(SR.TraceCodeWorkflowDurableInstanceLoaded, InstanceId);
|
||
|
TraceUtility.TraceEvent(TraceEventType.Information,
|
||
|
TraceCode.WorkflowDurableInstanceLoaded, traceText,
|
||
|
new StringTraceRecord("DurableInstanceDetail", traceText),
|
||
|
this, null);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return workflowInstance;
|
||
|
}
|
||
|
}
|
||
|
}
|