2013-10-14 40 views
0

我有一個後臺工作者,我正在使用它來運行一個大功能,希望能夠加快我的窗口加載和響應速度。當我將這個函數放在backgrounderworker的doWork事件中時,我只是想知道,如果BGW完成後我可以優先考慮更新文本的優先級,而不是等待UI線程完成並更新文本框。這可能嗎?我只問,因爲在運行該函數後(大約需要1.5-2s)更新文本框似乎需要花費一些時間,但即使在窗口加載之前啓動BGW開始(需要花費5秒鐘才能加載) ),它仍然是我窗口中更新的最後一項,所以我想(如果可能)停止UI線程更新UI,直到我更新此函數返回的內容,然後繼續更新其餘標籤。當backgroundworker完成時,如何優先更新UI線程?

另外,是否有無論如何更新兩個單獨的項目,或者它是限制在一個UI線程?

+0

BackgroundWorkers不會讓事情變得更快,它們只是提供一種運行代碼而不會阻塞GUI的方式。這就是說,這聽起來像你還在運行阻止GUI的代碼,因爲你正在等待UI線程完成。你將不得不張貼一些代碼。 – LarsTech

回答

1

如果要更新UI元素,則必須在UI線程上執行此操作。當BackgroundWorker完成時,將在UI線程上引發RunWorkerCompleted事件。如果UI線程忙於做某件事,那麼完成的事件必須等待。一般來說,沒有安全的方法來中斷UI線程,使其處理RunWorkerCompleted事件,然後回到它正在做的事情。

UI元素必須從UI線程更新。所以你不能一次更新兩個單獨的項目。

我不知道你的初始化是如何構建的,但是如果你有一組項目可以在BGW完成之前初始化,另一組在BGW完成之前不能更新,那麼請執行第一組和停止。然後讓RunWorkerCompleted處理程序執行其更新以及所有其他更新。所以它看起來像這樣:

FormLoad() 
    start background worker 
    do first group of updates 

RunWorkerCompletedHandler() 
    update from BGW calculation 
    do rest of updates