2008-09-14 47 views
2

這個問題與this question about exception handling有一點關係。我在那裏找到的解決方法包括滾動我自己的消息循環。滾動你自己的消息循環,有什麼陷阱?

所以我的主要方法現在基本上是這樣的:

[STAThread] 
static void Main() { 
    // this is needed so there'll actually an exception be thrown by 
    // Application.Run/Application.DoEvents, instead of the ThreadException 
    // event being raised. 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    Form form = new MainForm(); 
    form.Show(); 

    // the loop is here to keep app running if non-fatal exception is caught. 
    do { 
    try { 
     Application.DoEvents(); 
     Thread.Sleep(100); 
    } 
    catch (Exception ex) { 
     ExceptionHandler.ConsumeException(ex); 
    } 
    } 
    while (!form.IsDisposed); 
} 

什麼我不知道,雖然,這是一種安全/體面的方式來取代較爲典型 「Application.Run(新的MainForm( ));」,無論是用於異常處理還是用於其他任何事情,還是應該始終堅持使用Application.Run?

在另一個應用程序,在測試現在類似的方法同時用於裝載(閃屏)和異常處理,我不認爲它造成任何麻煩(尚未:-))

回答

2

陷阱1:

Thread.Sleep(100); 

從來沒有。使用WaitMessage()。

否則,有可能推出自己的消息循環,但在你的情況下,它似乎有點毫無意義。

您可能還想檢查Application.Run()代碼(例如使用.Net反射器)。

+0

在.NET中似乎沒有WaitMessage等價物,並且僅爲消息循環使用P/Invoke似乎有點涉及。 (不是說它很難,但它不能以這種方式..) 另外我沒有另一個解決方案,我的其他問題(請參閱此問題中的鏈接),爲什麼它沒有意義? :p – Tobi 2008-09-14 20:18:45

0

是的......我認爲有些組件不會使用該代碼。他們中的一些人需要生活在一個線程中,該線程中有一個Application.Run來有效地接收他們的消息。

2

如果要定製消息處理,請考慮實現IMessageFilter,然後調用Application.AddMessageFilter以通知標準消息泵調用您的過濾器函數。