[英]C# network application threading causes program to block
我正在使用線程處理網絡應用程序。 我有一個事件處理程序,該事件處理程序導致屏幕上顯示一個表單。 問題在於進行此調用的線程緊隨其后阻塞,因此顯示阻塞的窗體也是如此。
我通過使該函數更改其當前所處形式的內容來解決此問題,然后使用所需的invoke來將新表單強加到該線程上。 這是一個可怕的技巧,使新form.Show()方法通過其自己的線程的正確方法是什么。
請注意,我嘗試僅制作僅運行form.show()的工作線程,但該窗體在調用后立即消失。
謝謝,
下午
您不希望在自己的線程中創建UI元素。 啟動應用程序的主線程應該是UI線程。 創建並顯示該線程上的所有元素。 您所有繁重,長時間或阻塞的工作都應在各自的線程上完成。
當您需要對主(UI)線程進行更新(例如更新進度條或顯示最終結果)時,可以使用BackgroundWorker執行單個附加任務而不會阻塞UI,並獲得自動同步。
如果需要多個線程來進行長時間運行,請使用ThreadPool。 如果需要更新UI元素,則必須執行自己的跨線程同步。 如果這是您要走的路線,那么已經有很多答案可以解決。
如果在等待某些事件發生時有多個線程被阻塞,則應自己使用線程。 這將使ThreadPool不會因為線程全部阻塞而挨餓。 (我相信.NET 4中已對此進行了更改,因此,如果您以該版本為目標,則在這種情況下可以輕松地繼續使用ThreadPool。)
您是否嘗試過將阻塞調用放入BackgroundWorker(單獨的線程)中? 完成該阻止調用后,您的后台工作線程完成(由您的主UI線程處理)。 然后,在該完成的處理程序中,您可以顯示您的表單/消息或其他內容。
如果您還沒有嘗試過,那就試試吧。 請注意,由於我不知道您在做什么,因此我尚未對此進行測試。
干杯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.