워크플로 일시 중지 및 다시 시작
워크플로는 Delay와 같은 차단 활동과 책갈피에 대한 응답으로 일시 중지되고 다시 시작되지만, 지속성을 사용하여 명시적으로 워크플로를 일시 중지하고 언로드하고 다시 시작할 수도 있습니다.
워크플로 일시 중지
워크플로를 일시 중지하려면 Unload를 사용합니다. 이 메서드는 워크플로가 유지되고 언로드되도록 요청하며 워크플로가 30초 안에 언로드되지 않는 경우 TimeoutException을 throw합니다.
try
{
// attempt to unload will fail if the workflow is idle within a NoPersistZone
application.Unload(TimeSpan.FromSeconds(5));
}
catch (TimeoutException e)
{
Console.WriteLine(e.Message);
}
워크플로 다시 시작
이전에 일시 중지되고 언로드된 워크플로를 다시 시작하려면 Load를 사용합니다. 이 메서드는 워크플로를 지속성 저장소에서 메모리로 로드합니다.
WorkflowApplication application = new WorkflowApplication(activity);
application.InstanceStore = instanceStore;
application.Load(id);
예시
다음 코드 샘플에서는 지속성을 사용하여 워크플로를 일시 중지하고 다시 시작하는 방법을 보여 줍니다.
static string bkName = "bkName";
static void Main(string[] args)
{
StartAndUnloadInstance();
}
static void StartAndUnloadInstance()
{
AutoResetEvent waitHandler = new AutoResetEvent(false);
WorkflowApplication wfApp = new WorkflowApplication(GetDelayedWF());
SqlWorkflowInstanceStore instanceStore = SetupSqlpersistenceStore();
wfApp.InstanceStore = instanceStore;
wfApp.Extensions.Add(SetupMyFileTrackingParticipant);
wfApp.PersistableIdle = (e) => { ///persists application state and remove it from memory
return PersistableIdleAction.Unload;
};
wfApp.Unloaded = (e) => {
waitHandler.Set();
};
Guid id = wfApp.Id;
wfApp.Run();
waitHandler.WaitOne();
LoadAndCompleteInstance(id);
}
static void LoadAndCompleteInstance(Guid id)
{
Console.WriteLine("Press <enter> to load the persisted workflow");
Console.ReadLine();
AutoResetEvent waitHandler = new AutoResetEvent(false);
WorkflowApplication wfApp = new WorkflowApplication(GetDelayedWF());
wfApp.InstanceStore =
new SqlWorkflowInstanceStore(ConfigurationManager.AppSettings["SqlWF4PersistenceConnectionString"].ToString());
wfApp.Completed = (workflowApplicationCompletedEventArgs) => {
Console.WriteLine("\nWorkflowApplication has Completed in the {0} state.",
workflowApplicationCompletedEventArgs.CompletionState);
};
wfApp.Unloaded = (workflowApplicationEventArgs) => {
Console.WriteLine("WorkflowApplication has Unloaded\n");
waitHandler.Set();
};
wfApp.Load(id);
wfApp.Run();
waitHandler.WaitOne();
}
public static Activity GetDelayedWF()
{
return new Sequence {
Activities ={
new WriteLine{Text="Workflow Started"},
new Delay{Duration=TimeSpan.FromSeconds(10)},
new WriteLine{Text="Workflow Ended"}
}
};
}
private static SqlWorkflowInstanceStore SetupSqlpersistenceStore()
{
string connectionString = ConfigurationManager.AppSettings["SqlWF4PersistenceConnectionString"].ToString();
SqlWorkflowInstanceStore sqlWFInstanceStore = new SqlWorkflowInstanceStore(connectionString);
sqlWFInstanceStore.InstanceCompletionAction = InstanceCompletionAction.DeleteAll;
InstanceHandle handle = sqlWFInstanceStore.CreateInstanceHandle();
InstanceView view = sqlWFInstanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(5));
handle.Free();
sqlWFInstanceStore.DefaultInstanceOwner = view.InstanceOwner;
return sqlWFInstanceStore;
}
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET