簡體   English   中英

如何使用后台工作程序將參數(字符串)發送到UI線程?

[英]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.

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