2013-04-21 2 views
0

DoWork에서 ReportProgress() 메서드를 호출하여 ProgressChangedEvent 이벤트 처리기를 사용하여 UI를 업데이트 할 수있는 경우 Dispatcher.BeginInvoke() 메서드를 사용하여 UI를 업데이트해야하는 이유는 누구나 WPF에서 알 수 있습니까? 이벤트 이벤트 핸들러? 백그라운드 작업자와 디스패처에 대한 이해가 잘못 되었습니까?BackgroundWorker 및 Dispatcher.BeginInvoke (WPF)

+0

답변에서 언급했듯이 진행 중이거나 완료된 처리기의 UI 만 DoWork 이벤트 처리기에서 업데이트하면 안됩니다. –

답변

2

당신이 기억해야 할 하나의 규칙이있다 : UI를 업데이트

는 UI 스레드에서 수행 할 필요가.

디스패처 을 발송자는 BeginInvoke를 호출 할 때, 스레드 디스패처에 메소드를 실행한다 객체이다이 점을 염두에 유지

,의 어떤 발송자가 수행하고 무엇 BackgroundWorker에가하는 보자 만들어졌습니다. 응용 프로그램의 디스패처는 항상 UI 스레드에서 만들어 지므로 작동합니다.

배경 노동자 배경 노동자는 이벤트 기반 API 제공하지만, 매우 유사하다 : 당신이 DoWork-방법 내부 ReportProgress를 호출 할 때 이는있는 BackgroundWorker가 배경 노동자이었다 스레드에서 이벤트를 발생시킬 것 만들어진. 따라서 UI 스레드에서 Background-Worker를 만들면 ProgressChanged 이벤트 처리기에서 UI를 업데이트 할 수 있습니다.

2

Dispatcher를 호출 할 필요없이 BackgroundWorker의 ProgressChanged 핸들러에서 UI를 안전하게 업데이트 할 수 있습니다.

ReportProgress을 호출 할 때마다 ProgressChanged 이벤트가 발생합니다. 일반적으로 UI 스레드 인 BackgroundWorker 인스턴스를 만든 스레드에서 실행됩니다. ReportProgress의 설명 부분에서

:

ReportProgress 방법에 대한 호출은 비동기 즉시 를 반환합니다. ProgressChanged 이벤트 처리기는 BackgroundWorker를 만든 스레드 에서 실행됩니다.