2016-05-25 12 views
0

Ich habe eine einfache WPF-Anwendung, die auch dann ausgeführt wird, nachdem ich sie explizit zum Herunterfahren aufgerufen habe.WPF-Anwendung wird auch nach dem expliziten Herunterfahren fortgesetzt

Es integriert sich in eine Anwendung von Drittanbietern und muss überprüfen, dass einige Dokumente eines bestimmten Typs und mit bestimmten Inhalt geöffnet sind, wie es initialisiert wird. Hier

ist ein Teil des Initialisierungscode:

try 
{ 
    ActiveProductDoc = Automation.CATIA.ActiveDocument as ProductDocument; 
} 
catch 
{ 
    InvalidAssemblyShutdown("You must have an assembly open before you run the app"); 
} 

if(ActiveProduct == null) 
    InvalidAssemblyShutdown("You must have one assembly open (not a part)"); 

ActiveProduct = ActiveProductDoc.Product; 

Und hier ist die InvalidAssemblyShutdown Methode:

private void InvalidAssemblyShutdown(string message) 
{ 
    MessageBox.Show(message); 
    Close(); 
    Application.Current.Shutdown(); 
} 

ich den Antrag der Shutdown Eigenschaft auf OnMainWindowClose gesetzt haben.

Ich mache gerade einen Use-Case-Test, bei dem der Benutzer den falschen Dokumenttyp geöffnet hat und das ActiveProduct-Feld daher null ist. Die InvalidAssemblyShutdown-Methode wird als erwartet aufgerufen, trotzdem wird die Zeile in der Initialisierungsmethode nach dem Shutdown-Aufruf weiterhin ausgeführt und löst eine Ausnahme aus.

Irgendwelche Ideen, was ist los?

Soll ich stattdessen Ausnahmen auslösen und einen globalen Ausnahmebehandler verwenden?

Antwort

2

Wenn Sie sich den Quellcode für Application.Current.Shutdown (link to source) ansehen, sehen Sie, dass er Dispatcher.BeginInvoke() verwendet, um das Herunterfahren zu initiieren. Mit anderen Worten, das Herunterfahren wird in der Warteschlange auf dem UI-Thread. Es wird während dieses präzisen Methodenaufrufs nicht wirksam, sodass der folgende Code weiterhin ausgeführt wird.

Sie müssen den Code direkt nach dem Anruf an Application.Current.Shutdown beenden, wenn Sie nicht möchten, dass Code ausgeführt wird, während die Anforderung zum Herunterfahren verarbeitet wird. Etwas wie:

if(ActiveProduct == null) 
{ 
    InvalidAssemblyShutdown("You must have one assembly open (not a part)"); 
    return; // prevent further code execution. 
} 

Für das, was es wert ist, this.Close() funktioniert in ähnlicher Weise. Wenn Sie also eine ordnungsgemäße Flusskontrolle haben, müssen Sie Application.Current.Shutdown überhaupt nicht aufrufen. Ihr Anruf an this.Close() sollte ausreichen.

+0

diese Antwort ist viel zu einfach – Eric

+1

Ich bin mir sicher, dass wir etwas viel Komplexeres finden könnten, wenn Sie möchten. –

Verwandte Themen