2008-09-14 6 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 Reflectorなど)を調べることもできます。

+0

.NETではWaitMessageと同等の機能はないようですが、メッセージループのためだけにP/Invokeを使用すると少し関係しているようです。 また私は私の他の質問(この質問のリンクを参照)のための別の解決策を持っていないので、それはなぜ無意味なのですか? :p – Tobi

+0

私を許してください。しかし、もしあなたがピンボケがあまりにも関与していると思えば、カスタムメッセージループを書くことについてもう一度考えるべきです。あなたの他の質問に関しては、いくつかのあいまいな理由が_unhandled_例外イベントで例外を処理したい場合、いくつかのハックの準備をしてください。 – ima

+0

私の経験上、高レベルの例外処理は常に1つの大きなハックであり、できるだけ多くのことをやりたいのです。デバッグ/ログ出力の最も内側の例外を取得することはオプションではありません。すべてのイベントハンドラのtry catchブロックを貼り付けることもできません。 – Tobi

0

はい...私はいくつかのコンポーネントは、そのコードで動作しないと思う。その中には、効果的にメッセージを受け取るためのApplication.Runを持つスレッドに存在する必要があります。

2

メッセージ処理をカスタマイズする場合は、IMessageFilterの実装を検討し、Application.AddMessageFilterを呼び出して標準メッセージポンプにフィルタ関数を呼び出すように指示します。

関連する問題