簡體   English   中英

C#網絡應用程序線程導致程序阻塞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM