BackgroundWorker在C#線程安全嗎?如何確保用戶界面響應使用BackgroundWorker
我之所以問這個是因爲我得到一個線程創建的
控件不能 的父對象的控制上 不同的線程
例外吧。這是我的DoWork
事件代碼:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
var openFile = document.Open(MyFileName);
e.Result = openFile;
}
其中document
是在創建父窗體時被初始化的UI控件。在Open
方法期間,document
中的各種屬性將被填充。
我試圖改變代碼來調用,但同樣的問題仍然存在。即,
document.GetType().GetMethod("Open)".Invoke(document, new object[]{MyFileName})
將產生相同的誤差作爲上方。
任何想法如何操縱document
控件?換句話說,如何讓上面的代碼工作?
編輯:有人建議我使用Control.Invoke
,但它仍然沒有工作(兩個線程掛起)。這是我試過的代碼:
private delegate bool OpenFile(string filePath);
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
OpenFile oF = new OpenFile(document.Open);
var openFile = Invoke(oF, MyFileName); // it doesn't really matter whether I use BeginInvoke or Invoke, or other Control.Invoke, the end result is the same. Both the main thread hosting the document and the thread that launches the UI hanged.
e.Result = openFile;
}
@Mehdrad,我需要一個後臺工作來保持UI的響應,這是*爲什麼它是有道理的。 – Graviton
@Ngu Soon Hui:當然,如果你有一個長期運行的任務,不只是UI操作,你會使用它。如果你在DoWork方法中所做的所有操作都是操作UI對象,那麼你不應該使用BackgroundWorker,原因是你最終必須在UI線程上執行所有這些UI操作。 –
它可以是有道理的,它可能更微妙。線程可能只是通知「UI線程」「發生了什麼新事情」,然後它取決於UI需要更新UI的任何通知處理程序。 –