2009-12-08 4 views
6

Titolo su di esso. App WPF con alcune cose WCF per IPC. Chiamo Application.Current.Shutdown() e l'app continua felicemente. Pensavo che lo Shutdown fosse inarrestabile.Application.Current.Shutdown() non

Forse perché viene chiamato da un thread in background? Devo fare un po 'di smanettamento?

risposta

12

Si ottiene un'eccezione quando chiamo Application.Current.Shutdown in un thread diverso da quello principale, quindi presumo che si stia già utilizzando correttamente "dispatcher che manipola".

In ogni caso, questo si compila e si chiude un'applicazione, quindi se il bit dispatcher non sembra quello che hai potresti fionda in:

ThreadStart ts = delegate() 
    { 
     Dispatcher.BeginInvoke((Action)delegate() 
     { 
      Application.Current.Shutdown(); 
     }); 
    }; 
Thread t = new Thread(ts); 
t.Start(); 
+0

Stavo cercando di capirlo e questo sembra funzionare. C'è qualche spiegazione su come rendere avvolgente la chiamata di un dispatcher in un thread? – StrikeForceZero

+0

Alcune classi utilizzano thread che non vengono eseguiti in background. E Shutdown di solito uccide solo i thread in background automaticamente. Quindi dovresti assicurarti di disporre di eventuali variabili che utilizzano una classe che utilizza il threading prima di uscire. – Zunair

10

Nella mia esperienza, tutti i thread devono essere terminati esplicitamente o essere contrassegnati come thread in background affinché l'applicazione possa chiudersi.

Ecco un esempio di calci fuori un filo di lettura in background:

_readThread = new Thread(new ThreadStart(ReadThread)); 
_readThread.Name = "Receiver"; 
_readThread.Priority = ThreadPriority.Highest; 
_readThread.IsBackground = true; 
_readThread.Start(); 

La proprietà IsBackground è la chiave. Senza che sia impostato, il thread non si interromperà quando si chiama Shutdown.

+0

L'app si chiude normalmente con altri mezzi però. – Thomas

+0

Grazie mille per questo commento, mi ha salvato un po 'di mal di testa cercando di capire perché la mia applicazione non stava uscendo completamente. –

1

ho solo l'esperienza Application.Current.Shutdown non funziona quando ho' m in esecuzione da Visual Studio. All'interno di Visual Studio (almeno la versione 2010 che sto usando) Application.Current.Shutdown non fa nulla. Se faccio un singolo passaggio, esegue questa riga e poi continua. Se eseguo il programma (come .exe) da Windows Explorer, allora Application.Current.Shutdown funziona correttamente.

Probabilmente c'è una spiegazione per questo poiché durante il debug altri thread sono attivi, ma non riesco a spiegarlo.

+0

Sì, lo stesso qui, ma è davvero un problema con il mio debug. – ProfK