我創建了一個winforms多線程應用程序。只要主線程啓動,就會在另一個新產生的後臺線程上創建啓動畫面的窗體。UI有時會掛起(Windows窗體C#)
Code:
static SplashForm sf = new SplashForm();
main()
{
...
Thread t = new Thread(new ThreadStart(runSplash));
t.IsBackground = true;
t.start();
Application.Run(new MainForm());
...
}
void runSplash()
{
Application.Run(sf);
}
後來在主線程上創建了一個MainForm,在mainform的加載事件處理程序中正在關閉splash窗體。
有時UI掛起。
即它不響應鍵盤或鼠標操作。但是主線程和其他線程正在優雅地運行。
得到使用間諜++
<00001> 000103A6 S WM_WINDOWPOSCHANGING lpwp:003DF0DC
<00002> 000103A6 R WM_WINDOWPOSCHANGING
<00003> 000103A6 S WM_NCPAINT hrgn:00000001
<00004> 000103A6 S WM_GETTEXT cchTextMax:510 lpszText:003DDBAC
<00005> 000103A6 R WM_GETTEXT cchCopied:37 lpszText:003DDBAC ("I")
<00006> 000103A6 R WM_NCPAINT
<00007> 000103A6 S WM_ERASEBKGND hdc:D5010AC2
<00008> 000103A6 R WM_ERASEBKGND fErased:True
<00009> 000103A6 S WM_WINDOWPOSCHANGED lpwp:003DF0DC
<00010> 000103A6 R WM_WINDOWPOSCHANGED
<00011> 000103A6 S WM_ACTIVATEAPP fActive:True dwThreadID:000008A8
<00012> 000103A6 R WM_ACTIVATEAPP
<00013> 000103A6 S WM_NCACTIVATE fActive:True
<00014> 000103A6 R WM_NCACTIVATE
<00015> 000103A6 S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
<00016> 000103A6 R WM_ACTIVATE
<00017> 000103A6 S WM_IME_SETCONTEXT fSet:1 (LONG)iShow:C000000F
<00018> 000103A6 S WM_IME_NOTIFY dwCommand:00000002 dwData:00000000
<00019> 000103A6 R WM_IME_NOTIFY
<00020> 000103A6 R WM_IME_SETCONTEXT
<00021> 000103A6 S WM_SETFOCUS hwndLoseFocus:(null)
<00022> 000103A6 R WM_SETFOCUS
<00023> 000103A6 P WM_PAINT hdc:00000000
<00024> 000103A6 S WM_SETCURSOR hwnd:000103A6 nHittest:FFFE wMouseMsg:WM_MOUSEMOVE
<00025> 000103A6 R WM_SETCURSOR fHaltProcessing:False
<00026> 000103A6 S WM_SETCURSOR hwnd:000103A6 nHittest:FFFE wMouseMsg:WM_MOUSEMOVE
<00027> 000103A6 R WM_SETCURSOR fHaltProcessing:False
<00028> 000103A6 S WM_NCACTIVATE fActive:False
<00029> 000103A6 S WM_GETTEXT cchTextMax:510 lpszText:003DDBAC
<00030> 000103A6 R WM_GETTEXT cchCopied:37 lpszText:003DDBAC ("I")
<00031> 000103A6 R WM_NCACTIVATE fDeactivateOK:True
<00032> 000103A6 S WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null)
<00033> 000103A6 R WM_ACTIVATE
<00034> 000103A6 S WM_ACTIVATEAPP fActive:False dwThreadID:00000BB0
<00035> 000103A6 R WM_ACTIVATEAPP
<00036> 000103A6 S WM_KILLFOCUS hwndGetFocus:(null)
<00037> 000103A6 R WM_KILLFOCUS
<00038> 000103A6 S WM_IME_SETCONTEXT fSet:0 (LONG)iShow:C000000F
<00039> 000103A6 S WM_IME_NOTIFY dwCommand:00000001 dwData:00000000
<00040> 000103A6 R WM_IME_NOTIFY
<00041> 000103A6 R WM_IME_SETCONTEXT
<00042> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000
<00043> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000
<00044> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000
<00045> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000
<00046> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000
<00047> 000103A6 P message:0xC185 [Registered:"WindowsForms12_ThreadCallbackMessage"] wParam:00000000 lParam:00000000
是什麼原因造成這個問題,如何擺脫這種以下日誌消息?
如果沒有進一步的信息,就不可能說出這個問題。例如它究竟是什麼時候掛?那時執行什麼代碼? – 2012-08-17 05:49:28
當它處於掛起狀態時,您可以附加到應用程序並檢查Visual Studio中的「線程」窗口中的線程。這將指出你在哪個線程等待哪個對象/線程的正確方向。 – 2012-08-17 05:52:22