Datos de paso de subprocess y cierre de window

He creado un proyecto simple de WPF donde con el button clic creo un hilo separado con una nueva window, y paso datos a él. En la salida de la aplicación, bash cerrar con security ese hilo / window. Sin embargo, ocasionalmente recibo la exception siguiente, que causa inestabilidades de la aplicación.
Entonces mi pregunta es cómo manejar esa situación con gracia. Gracias

En línea:

Dispatcher.Invoke(new Action(() => 

yo tengo

 A first chance exception of type 'System.Threading.ThreadAbortException' occurnetworking in mscorlib.dll Additional information: Thread was being aborted. 

Mi vista tiene el siguiente código:

Constructor

 public MyView(ConcurrentQueue<MyItem> actionReports, ManualResetEvent actionCompletedEvent, string actionName) { _actionReports = actionReports; _actionCompletedEvent = actionCompletedEvent; _actionName = actionName; InitializeComponent(); DataContext = this; this.Loaded += MyView_Loaded; } void MyView_Loaded(object sender, RoutedEventArgs e) { var worker = new BackgroundWorker(); worker.DoWork += (o, ea) => { while (true) { if (_actionCompletedEvent.WaitOne(0)) { // Issue Dispatcher.Invoke(new Action(() => { Close(); })); Thread.Sleep(100); } while (!_actionReports.IsEmpty) { // Do some stuff } } }; worker.RunWorkerAsync(); } 

Inicializar de window

 public WindowLauncher(ManualResetEvent actionCompletedEvent, ManualResetEvent reportWindowClosedEvent, string actionName) { _actionCompletedEvent = actionCompletedEvent; _reportWindowClosedEvent = reportWindowClosedEvent; _actionName = actionName; Thread thread = new Thread(new ThreadStart(() => { _reportWindow = new MyView(_messageQueue, _actionCompletedEvent, actionName); _reportWindow.Show(); // InvokeShutdown to terminate the thread properly _reportWindow.Closed += (sender, args) => { _reportWindow.Dispatcher.InvokeShutdown(); }; _resetEvent.Set(); Dispatcher.Run(); })); thread.Name = "MyWindowThread"; thread.SetApartmentState(ApartmentState.STA); thread.IsBackground = true; thread.Start(); } 

Normalmente, al less intentaré cancelar la acción asincrónica de BackgroundWorker en el evento Window.OnClosing y atrapar la cancelación pendiente. Deberá tener cuidado con ThreadAbortExceptions, pero solo si su process asíncrono es de larga duración.

 private BackgroundWorker _worker; private void MyView_Loaded(object sender, RoutedEventArgs e) { _worker = new BackgroundWorker(); _worker.WorkerSupportsCancellation = true; _worker.DoWork += (o, ea) => { while (true) { if (_actionCompletedEvent.WaitOne(0)) { if (_worker.CancellationPending) { ea.Cancel = true; return; } // Issue Dispatcher.Invoke(new Action(() => { Close(); })); Thread.Sleep(100); } while (!_actionReports.IsEmpty) { // Do some stuff } } }; } protected override void OnClosing(CancelEventArgs e) { _worker.CancelAsync(); } 

El time de ejecución anula automáticamente los subprocesss cuando finaliza su aplicación. Normalmente no arrojan ThreadAbortExceptions (vea los hilos de primer plano y de background )

Invocar al despachador hace que se ejecute un método en el hilo de envío, pero como utilizó Invoke() lugar de BeginInvoke() , el despachador debe informar al hilo de background que el método finalizó. Sospecho que aquí es donde se plantea la exception, pero esto es solo una conjetura de mi parte.

Intenta atrapar la exception de esta manera:

 try { Dispatcher.Invoke(new Action(() => { Close(); })); } catch (ThreadAbortException) { Thread.ResetAbort(); } 

Aunque esto puede no ser útil si la exception se plantea en el hilo de envío. Si esto no funciona, intente con BeginInvoke() lugar.

Por cierto, probablemente puedas reproducir este error más fácilmente si obtienes algún tipo de retraso en el inicio de tu lambda invocada y cierras la aplicación en ese punto. Eso significa que el hilo de background se cancelará cuando la lambda finalice.