在最後一個問題Display progress bar while doing some work in C#?中,人們推薦使用BackgroundWorker
。我想在BackgroundWorker
DoWork方法中可以直接更新GUI,但爲什麼這個函數調用需要使用Invoke
來調用。BackgroundWorker仍然需要調用Invoke?
toolTip.SetToolTip(button, toolTipText);
在最後一個問題Display progress bar while doing some work in C#?中,人們推薦使用BackgroundWorker
。我想在BackgroundWorker
DoWork方法中可以直接更新GUI,但爲什麼這個函數調用需要使用Invoke
來調用。BackgroundWorker仍然需要調用Invoke?
toolTip.SetToolTip(button, toolTipText);
RunWorkerCompleted
回調編組到UI線程上; DoWork
不是。
您應該使用ReportProgress
方法在DoWork
處理期間更新UI。
你錯了,你不能直接從DoWork方法的處理程序調用UI線程,因爲它在後臺線程上。
如果要更新UI,應調用ReportProgress方法,然後從ProgressChanged事件的事件處理程序更新UI。
雖然您可以在後臺線程中調用Invoke方法,但這樣做會違背使用BackgroundWorker類的目的。 ProgressChanged事件在UI線程上拋出,並且是在後臺線程發生某些更改時用於更新UI組件的機制。
請記住,如果你從非UI線程調用的RunWorkerAsync(),您將需要從ProgressChanged和RunWorkerCompleted事件處理函數調用來調用。