2013-10-28 92 views
0

我正在製作一個簡單的GUI程序,它將爲您提供與用戶提供的搜索條件相匹配的特定文件列表。
有時搜索需要很多時間(10-15s)。所以我在一個新的線程中調用了搜索功能。同樣在函數中,有一些代碼只能在新創建的線程中止後運行。因此,我使用Join()函數來阻止程序的執行,直到線程完成。但是使用這會導致應用程序掛起。我可以解決這個問題嗎?在不阻擋正常控件的情況下阻塞線程

+0

您可能想要完成活動? – BlackBear

+3

只是不要調用Join()。當操作完成時,BackgroundWorker或Task可以讓您在UI線程上運行代碼。 –

+0

我基本上想要的是線程不應該掛斷應用程序,正常的消息循環應該繼續執行。 –

回答

3

你的UI掛起,因爲UI線程正在等待新的線程來完成 - 從本質上講,你如果您直接在UI線程上運行搜索,則會遇到同樣的問題。

解決方案:不要等待新線程。爲了在線程完成後對UI執行某些操作,可以使用Control.Invoke從該線程回調UI代碼。例如,如果您的形式被稱爲m_myForm,你可以這樣做在後臺線程調用UI線程上表單上的一個函數,將結果:

m_myForm.Invoke((Action)() => m_myForm.DoSomethingWithSearchResult(result)); 

或者,你可以使用BackgroundWorker代替直接使用線程。這將幫助您在非UI線程上運行某些內容,並在工作完成時引發事件,並負責在用戶界面和後臺工作之間正確同步。

相關問題