2013-04-21 110 views
0

WPF中的任何人都可以告訴我爲什麼我們需要使用Dispatcher.BeginInvoke()方法從DoworkEvent處理程序更新UI時,我們可以通過調用DoWork中的ReportProgress()方法使用ProgressChangedEvent事件處理程序更新UI事件事件處理程序? 如果我對後臺工作人員和調度員的理解不正確,請糾正我的問題?WPF中的BackgroundWorker和Dispatcher.BeginInvoke

+0

正如答案中所述,您不應該從DoWork事件處理程序更新UI,只需從進度和已完成的處理程序中更新UI。 – 2013-04-21 15:18:20

回答

2

有一個規則,你需要記住:

更新UI需要從UI線程來完成。

謹記這一點,讓我們看看調度員做什麼BackgroundWorker的作用:

調度 調度員是一個對象,當你調用BeginInvoke,將執行線程調度的方法被創建。應用程序的調度程序始終在UI線程上創建,因此這將起作用。

後臺工作 的後臺工作很相似,但它提供了一個基於事件的API: 當你調用ReportProgress的DoWork的法裏面,BackgroundWorker的將提高線程的背景工人是在一個事件創建。因此,如果您在UI線程上創建Background-Worker,則可以更新ProgressChanged事件處理程序內的UI。

2

您可以安全地從BackgroundWorker的ProgressChanged處理程序更新UI,而無需調用Dispatcher。

只要您撥打ReportProgress就會引發ProgressChanged事件。它在創建BackgroundWorker實例的線程上執行,該實例通常是UI線程。

從在ReportProgress備註部分:

到ReportProgress方法的調用是異步的,並立即返回 。 ProgressChanged事件處理程序在創建BackgroundWorker的線程 上執行。