我正在製作一個簡單的GUI程序,它將爲您提供與用戶提供的搜索條件相匹配的特定文件列表。
有時搜索需要很多時間(10-15s)。所以我在一個新的線程中調用了搜索功能。同樣在函數中,有一些代碼只能在新創建的線程中止後運行。因此,我使用Join()函數來阻止程序的執行,直到線程完成。但是使用這會導致應用程序掛起。我可以解決這個問題嗎?在不阻擋正常控件的情況下阻塞線程
0
A
回答
4
3
你的UI掛起,因爲UI線程正在等待新的線程來完成 - 從本質上講,你如果您直接在UI線程上運行搜索,則會遇到同樣的問題。
解決方案:不要等待新線程。爲了在線程完成後對UI執行某些操作,可以使用Control.Invoke從該線程回調UI代碼。例如,如果您的形式被稱爲m_myForm
,你可以這樣做在後臺線程調用UI線程上表單上的一個函數,將結果:
m_myForm.Invoke((Action)() => m_myForm.DoSomethingWithSearchResult(result));
或者,你可以使用BackgroundWorker代替直接使用線程。這將幫助您在非UI線程上運行某些內容,並在工作完成時引發事件,並負責在用戶界面和後臺工作之間正確同步。
相關問題
- 1. 在不阻塞GUI線程的情況下工作
- 2. 如何在不阻塞的情況下同步線程?
- 3. 阻止阻塞的線程阻塞
- 4. 阻塞隊列不阻塞線程?
- 5. 在不阻塞主線程的情況下從python線程返回值
- 6. 在不阻擋主線程的情況下添加/重新加載mapview註釋
- 7. C#在不阻塞進程的情況下停止線程語法執行
- 8. 如何在不阻塞窗口的情況下打開文件?
- 9. 如何在不阻擋UI的情況下創建UIView
- 10. 如何在不阻塞線程的情況下在HttpWebRequest.BeginGetResponse上指定超時值
- 11. 如何在不阻塞主線程的情況下在xamarin中調用GetMapAsync?
- 12. 如何在不阻塞主線程的情況下返回異步HttpWebResponse?
- 13. Java - 在不阻塞主線程的情況下停止時間片
- 14. 如何在不阻塞主線程的情況下暫停C#代碼執行?
- 15. MessageBeep線程阻塞
- 16. 阻塞線程 - Java
- 17. 非阻塞線程
- 18. Java線程阻塞
- 19. 將線程阻塞轉換爲f中的非線程阻塞#
- 20. 非常罕見的情況 - 線程被阻塞在它所持有的鎖上?
- 21. 如何在不阻塞的情況下輪詢Web請求?
- 22. 如何在不阻塞的情況下調用NetworkStream.Read()?
- 23. 如何在不阻塞的情況下運行腳本?
- 24. 阻止Tomcat中的線程阻塞
- 25. 在.Net中阻塞線程
- 26. 如何在不阻擋UI的情況下向WPF程序添加延遲
- 27. 在CPU負載過重的情況下發生跨線程BeginInvoke阻塞
- 28. 阻塞或不阻塞(Express.js)
- 29. 了shell_exec阻塞直到完成,我想它是不可阻擋
- 30. 默認情況下在plone中阻塞上下文portlet
您可能想要完成活動? – BlackBear
只是不要調用Join()。當操作完成時,BackgroundWorker或Task可以讓您在UI線程上運行代碼。 –
我基本上想要的是線程不應該掛斷應用程序,正常的消息循環應該繼續執行。 –