我有一個C#.NET多線程應用程序凍結了界面。不尋常的是,除非我讓系統閒置足夠長的時間以使屏幕保護程序啓動(這要求我重新輸入密碼以重新訪問系統),否則界面不會凍結。當界面再次可見時(在我成功輸入密碼後),界面被鎖定。只要我不讓屏幕保護程序啓動,那麼界面不會鎖定。多線程c#應用程序中的界面凍結
我應該指出,我有兩個不同的可執行文件訪問相同的DLL,並且無論使用哪個應用程序訪問該DLL,都會發生此問題。這似乎意味着問題出在DLL上,因爲除了它們與DLL的關聯外,這兩個應用程序完全不同(C++/MFC)和(C#/ .NET)。
這兩個exes在它們如何與DLL交互時執行類似的步驟。他們調用dll來設置串口通信,在DLL中打開一個狀態窗口,在DLL中啓動一個線程來監視通信端口,然後在主應用程序中啓動一個監視dll中棧的線程。
當通過DLL中的線程從通信端口獲取數據時,將對其進行分析,並將其結果放置在堆棧上,然後通過委託將其發佈到狀態窗口。當exe中的線程看到堆棧中的數據時,它會使用委託在主窗口中輸出數據。
我發現,如果我將代碼添加到DLL中的線程,因此它每30秒調用一次Application.DoEvents(),界面將被凍結約30秒,然後像平常一樣恢復活動。 我認爲某些東西阻塞了主線程並強制DoEvents()發射似乎破壞了鎖定,但我不知道可能會導致此鎖定。
在我的開發機器和測試機器上都會出現此問題。
我已經嘗試完全刪除數據的輸出到DLL中的狀態窗口,但沒有任何區別。
我一直在做多線程編程多年,從未見過這樣的事情;所以任何意見將不勝感激。
謝謝。
暫停調試器中凍結的用戶界面並查看調用堆棧。 – SLaks 2011-01-11 15:35:25
您是否嘗試過僅從非UI線程調用DLL方法並編組到UI線程? – RobS 2011-01-11 15:36:35