ManualWorkflowSchedulerService.RunWorkflow()의 올바른 사용법에 대해 궁금합니다. ManualWorkflowSchedulerService.RunWorkflow를 호출 할 때 스레드간에 동일한 workflowInstanceId에 대한 호출을 동기화해야합니까?스레드 안전성 ManualWorkflowSchedulerService.RunWorkflow
1
A
답변
3
아니요, 그렇게 생각하지 않습니다. WorkflowInstance에 작업이 임의의 스레드에서 호출 할 수 있지만 book 'Essential Windows Workflow Foundation'
에서 관련 발췌입니다 다음, 프로그램 인스턴스 내에서 호스팅 WF 스케줄러 는 단일 스레드에 의해 서비스 입니다. WF 런타임은 다른 스레드가 스케줄러를 방해하거나 서비스 할 수 없도록하며 디스패처 루프는 작업 항목을 적극적으로 처리하는 입니다. 이 이 ( 실행의 에피소드)을 전용 스레드에 활동을 실행하는 스케줄러 에 영향을주지 않습니다 - 은 분명, 동시에 별도의 스레드에서 WorkflowInstance의 메소드를 호출 할 수있는 호스팅 응용 프로그램합니다.
편집 : 더 문제를 조사하기 위해, 나는 두 HandleExternalEvent
활동을 포함하는 ParallelActivity
와 WF를 만들었습니다. 각 작업의 invoked
처리기는 해당 스레드를 3 초 동안 절전 모드로 전환합니다. 호스트 프로그램에서 두 개의 스레드를 생성하고 서비스를 통해 두 개의 이벤트를 트리거합니다. 또한, 해당 Schedule
메서드를 추적하기 위해 ManualWorkflowSchedulerService
하위 클래스입니다.
Src Time Thread
HOST 7616 1 CreateWorkflow
MWSS 7642 1 Schedule workflow
HOST 8297 12 Trigger event 1 and wait for RunWorkflow
MWSS 8316 12 Schedule workflow
WF 8327 12 Handler 1 Invoked...wait 3 sec
HOST 8327 1 Press any key to exit...
HOST 8767 13 Trigger event 2 and wait for RunWorkflow
MWSS 8784 13 Schedule workflow
WF 38319 12 Handler 1 Completed
WF 38406 12 Handler 2 Invoked...wait 3 sec
WF 68396 12 Handler 2 Completed
HOST 68573 13 RunWorkflow for event 2 completed in 5,98 sec
HOST 68794 12 WorkflowCompleted
HOST 68795 12 RunWorkflow for event 1 completed in 6,05 sec
일부 발언 : 여기에 결과가 (시간이 MS의 1/10에)입니다
- 스케줄러는 항상 작업 항목을 예약하는 호스트의 스레드를 사용합니다.
- 워크 플로 인스턴스 이 항상 호스트의 스레드를 사용하여 작업을 실행하는 것은 아닙니다. 다른 활동이 이미 스레드에서 실행중인 경우,이 스레드는 모든 스케줄 된 활동을 실행하는 데 사용됩니다.
- 핸들러의 실행은 스레드로부터 안전하지만 두 스레드는 두 핸들러가 완료 될 때까지 대기합니다!
후자는 우려가있는 경우, 내가 제안 다음 글 :
- Understanding ParallelActivity in Windows Workflow
- Use Workflow to Invoke Web Services in Parallel BTW
, 당신은 당신이 시나리오에 대한 몇 가지 정보를 공유 할 수 있습니다 면함?
나는 당신의 견적이 DefaultWorkflowSchedulerService에 한정되어 있다고 생각한다. 그것은 별도의 스레드 동작을 스케쥴러의 측면으로 묘사하기 때문이다. 또한 ManualWorkflowSchedulerService에 해당하지 않는 단일 스레드에 의해 호스팅되는 스케줄러를 말합니다. –
어쩌면 당신은 인용에 대해서는 맞지만 (Reflector가 보여주는 것처럼) ManualWorkflowSchedulerService는 내부 동기화 사전을 사용하여 모든 작업 항목을 처리 (스케줄 및 실행) 할 수 있으므로 다른 스레드에서 동일한 인스턴스를 호출하는 것이 안전하다고 생각합니다. – Panos
좋은 작품 Panos. 시나리오는 사용자 당 하나의 워크 플로가있는 ASP.NET 응용 프로그램입니다. 잠재적으로 사용자는 동시에 여러 요청을 할 수 있습니다. 단일 작업 흐름 인스턴스에서 여러 스레드가 대기하는 것은 불행하지만 WF가 아닌 비동기 ASP.NET의 문제입니다. –