2013-04-03 4 views
0

다른 사람들이 작성한이 코드를 작성 중입니다. DoWork에서 Dispatcher.Invoke를 호출하는 백그라운드 작업자를 포함합니다.Backgroundworker calling Dispatcher.Invoke

제 문제는 내 Dispatcher.Invoke가 완료되기 전에 BackgroundWorkerCompleted가 발생한다고 생각합니다. 그 맞습니까?

Dispatcher.Invoke가 새 스레드를 시작하거나 주 스레드에서 시작할 수 있습니까?

Dispatcher와 Backgroundworker를 혼합하는 것은 나쁜 생각입니까? 내가 찾은 샘플은 그 중 하나만 사용하는 것 같습니다.

답변

1

제 문제는 내 Dispatcher.Invoke가 완료되기 전에 내 BackgroundWorkerCompleted가 번 발생한다고 생각합니다. 그 맞습니까?

아니요, 맞지 않습니다.

Dispatcher.Invoke가 새 스레드를 시작하거나 주 스레드에서 시작할 수 있습니까?

아니요, UI 스레드에서 코드를 실행합니다. 따라서 크로스 스레드 예외가 발생하는 것을 방지 할 수 있습니다. 일반적으로 GUI 내용을 수정하는 데 사용됩니다.

은 WPF에서는 DispatcherObject에 만든 유일한 스레드가 객체 에 액세스 할 수 있습니다

Dispatcher.Invoke를 참조하십시오. 예를 들어 주 UI 스레드에서 분리 된 스레드는 UI 스레드에서 생성 된 단추의 내용을 업데이트 할 수 없습니다. 백그라운드 스레드가 Button의 Content 특성 인 에 액세스하려면 배경 스레드 이 UI 스레드과 연관된 Dispatcher로 작업을 위임해야합니다. 이것은 Invoke 또는 BeginInvoke를 사용하여 수행됩니다. 호출은 동기이며 BeginInvoke는 비동기입니다. 조작은 지정된 DispatcherPriority에있는 Dispatcher의 이벤트 큐 에 추가됩니다.

+0

감사합니다. Invoke에서 호출 된 메서드가 새 Task()를 생성한다는 것을 알았습니다. 그래서 내 실제 작업이 끝나기 전에 내 완료가 트리거되는 이유를 설명합니다. 개판 이구만! – Jepzen