簡體   English   中英

WPF中的BackgroundWorker和Dispatcher.BeginInvoke

[英]BackgroundWorker and Dispatcher.BeginInvoke in WPF

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

您需要記住一個規則:

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

牢記這一點,讓我們看看調度程序做什么以及后台工作程序做什么:

分派器分派器是一個對象,當您調用BeginInvoke時,它將在創建分派器的線程上執行該方法。 應用程序的調度程序始終在UI線程上創建,因此可以正常工作。

后台工作程序后台工作程序非常相似,盡管它提供了基於事件的API:當您在DoWork方法中調用ReportProgress ,BackgroundWorker將在創建后台工作程序的線程上引發一個事件。 因此,如果在UI線程上創建Background-Worker,則可以在ProgressChanged事件處理程序中更新UI。

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

每當您致電ReportProgress時,都會引發ProgressChanged事件。 它在創建BackgroundWorker實例的線程上執行,該實例通常是UI線程。

在ReportProgress的“備注”部分中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM