[英]How can I send arguments(string) to the UI thread with the Background Worker?
我在應用程序上使用后台工作程序更新UI上的進度條。 我可以使用以下方法報告進度。
backgroundWorker.ReportProgress(barProgress);
問題在於ReportProgress方法僅采用整數作為參數,但是我還需要傳遞一個字符串來更新進度條上的標簽。
progressLabel.Text = "Passed Argument";
progressLabel.Refresh();
我似乎找不到找到直接將其傳遞給BackgroundWorker對象的方法。 有沒有我看不見的方法或執行此操作的方法?
問題在於ReportProgress方法僅采用整數作為參數
實際上,還有另一個ReportProgress
方法重載 ,它允許您傳遞其他任意對象,然后可以通過ProgressChangedEventArgs.UserState
屬性對其進行訪問。
例如:
backgroundWorker.ReportProgress(barProgress, "Passed Argument");
然后在ProgressChanged
事件中:
progressLabel.Text = e.UserState as string;
progressLabel.Refresh();
ReportProgress
的重載具有一個userstate
參數。 此類型為object
,因此可以是任何您喜歡的類型。
因此,請從您的DoWork
處理程序中調用它,如下所示:
backgroundWorker.ReportProgress(barProgress, "Passed Argument");
並按如下方式在您的ProgressChanged
處理程序中訪問它:
progressLabel.Text = (string)e.UserState;
progressLabel.Refresh();
是的,可以,您只需要調用與該控件關聯的Dispatcher
。
Dispatcher.BeginInvoke(new Action(()=>{
progressLabel.Text = "Passed Argument";
progressLabel.Refresh();
});
UI在單線程單元(STA)中運行 ,通常不允許跨線程訪問 (如果之前嘗試過,可能會遇到CrossThreadException )。 通過調用Dispatcher
您基本上告訴它在再次執行UI線程時要執行的操作。
只要確保您不從UI-Thread本身調用Dispatcher.Invoke
,就會死鎖它。 如果您有可以從用戶界面或其他線程調用的方法,則可以檢查是否當前使用名為CheckAccess
的隱藏方法(無自動完成或IntelliSense)進行訪問,如果您可以直接訪問該控件,則該方法將返回true
否則,則返回false
您必須使用Dispatcher。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.