2012-07-30 2 views
0

스테이지를 설정하려면 Task 개의 객체를 보유하는 Scheduler이라는 사용자 정의 클래스가 있습니다.이 클래스는 사용자 정의 클래스이기도합니다. 각 작업에는 장기 실행 작업을 실행하는 BackgroundWorker 개체가 있습니다. 나는 현재 이러한 작업 중 많은 부분을 빠르게 실행하고 동시에 처리하는 테스트를 수행하고 있습니다. 내 Task 객체에서이미 실행 중일 때 이벤트가 처리됩니까?

, 나는 작업이 완료 스케줄러를 경고하기 위해 TaskWorkerCompleted 핸들러의 사용자 정의 이벤트 (TaskCompletedEvent)를 올립니다. 스케줄러는 모든 태스크의 TaskCompletedEvent에 대해 동일한 이벤트 핸들러를 사용합니다.

제가 알고 싶은 것은 현재 SchedulerTaskCompletedEvent 처리기 코드를 실행하고 다른 이벤트가 완료되면 어떻게됩니까? 둘 다 UI 스레드에있게 될 것이므로 다른 이벤트 처리기가 처리되기 전에 현재 이벤트 처리기에있는 이벤트 핸들러가 완성됩니까? 두 사건이 동시에 끝나고 처리되어야 할 때 일어날 일에 대해 혼란스러워합니다.

+0

둘 다 UI 스레드에 있습니다. UI 스레드에있는 경우 동시에 완료 할 수 없습니다. 코드 예제가 도움이 될 수 있습니다. – svick

+0

정확하게 'TaskCompletedEvent'를 얼마나 올립니까? UI 스레드에서 그렇게합니까? – svick

+0

@svick 예, UI 스레드에서 삭제합니다. 나는 블라드가 내 질문에 대답했다고 생각한다. 코드를 올바르게 이해하기 위해 일부 코드를 테스트해야합니다. – Justin

답변

1

아니요, 이벤트 자체는 UI 스레드에 대해 알지 못합니다. 따라서 이벤트는 해고 된 동일한 스레드에서 전달됩니다 (배경 작업자의 스레드에서 발생했을 가능성이 가장 높습니다).

UI 스레드에서 두 이벤트가 동시에 발생하면이 이벤트가 동시에 발생할 수 없습니다. UI 스레드는 하나 또는 다른 이벤트 실행 코드를 실행 중입니다.) 따라서 첫 번째 이벤트가 실행 및 발송과 함께 완료되면 두 번째 이벤트가 시작될 수 있습니다.

Scheduler에서 UI 스레드로 이벤트를 마샬링하려면 약간 다른 이야기입니다. UI 스레드에서 실행해야하는 코드는 실제로 해당 스레드의 이벤트 대기열에 게시되고 이벤트 발생 코드가 먼저 발생하면 먼저 실행됩니다.

+0

UI 스레드에서 backgroundworker 이벤트가 시작됩니다. Invoke를 사용하는 것 같습니다. 따라서 같은 스레드에 있기 때문에 같은 시간에 두 이벤트가 동시에 발생하는 것에 대해 걱정할 필요가 없습니다. 맞습니까? – Justin

+0

@ Justin : 예. UI 스레드의 코드는 순차적으로 실행됩니다. 첫 번째 이벤트가 시작되고 모든 이벤트 핸들러가 완료되면 UI 스레드 만 다음 디스패치 된 명령을 찾으며 동시에가 아닙니다. – Vlad

관련 문제