2008-09-14 9 views
2

Diese Frage steht in etwa in Verbindung mit this question about exception handling. Die Problemumgehung, die ich dort gefunden habe, besteht darin, meine eigene Nachrichtenschleife zu rollen.Rolling Ihre eigene Nachrichtenschleife, irgendwelche Fallstricke?

So jetzt meine Hauptmethode sieht grundsätzlich wie folgt:

[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); 
} 

Was ich aber frage mich, dies eine sichere/anständige Art und Weise ist es, die typischere ‚Application.Run (neue Mainform zu ersetzen ()), ob es für die Ausnahmebehandlung oder für was auch immer verwendet wird, oder sollte ich immer bei der Verwendung von Application.Run bleiben?

Auf einer anderen Anwendung, die jetzt ein ähnlicher Ansatz bei der Prüfung ist für beide Laden (Begrüßungsbildschirm) und die Ausnahmebehandlung verwendet wird, und ich glaube nicht, dass irgendwelche Probleme verursacht hat (noch :-))

Antwort

2

Pitfall 1:

Thread.Sleep(100); 

Niemals. Verwenden Sie WaitMessage().

Andernfalls ist es möglich, eine eigene Nachrichtenschleife zu erstellen, aber in Ihrem Szenario scheint es etwas sinnlos.

Sie können auch den Code Application.Run() untersuchen (z. B. mit .Net Reflector).

+0

Es scheint kein WaitMessage-Äquivalent in .NET zu geben, und die Verwendung von P/Invoke nur für eine Meldungsschleife scheint etwas zu bedeuten. (Nicht, dass es schwer ist, aber es kann nicht so sein ..) Auch habe ich keine andere Lösung für meine andere Frage (siehe Link in dieser Frage), also warum ist es sinnlos? : p – Tobi

+0

Verzeihen Sie mich, aber wenn Sie denken, Pin-Invoke ist zu viel beteiligt sollten Sie wieder darüber nachdenken, zu versuchen, benutzerdefinierte Nachrichtenschleife zu schreiben. In Bezug auf Ihre andere Frage, wenn Sie aus irgendeinem Grund Ausnahmen im _unhandled_ Ausnahmeereignis behandeln möchten, seien Sie auf einige Hacks vorbereitet. – ima

+0

Meiner Erfahrung nach ist ein anständiges Highlevel-Exception-Handling immer ein großer Hack und ich möchte es so gut wie möglich erledigen. Nur die innerste Ausnahme in der Debug/Log-Ausgabe zu bekommen, ist KEINE Option, und Copy Pasting try catch Blöcke in allen Event-Handlern ist auch nicht ... – Tobi

0

Ja ... Ich denke, einige Komponenten werden nicht mit diesem Code arbeiten. Einige von ihnen müssen in einem Thread leben, der über eine Application.Run verfügt, um ihre Nachrichten effektiv abzurufen.

2

Wenn Sie die Nachrichtenverarbeitung anpassen möchten, sollten Sie IMessageFilter implementieren und dann Application.AddMessageFilter aufrufen, um der Standard-Nachrichtenpumpe mitzuteilen, dass sie Ihre Filterfunktion aufrufen soll.

Verwandte Themen