private static void RunInWpfWindow(Action <DispatchWpfObject> action, out Exception uiThreadException, out Exception workerThreadException) { DispatchWpfObject window = null; Exception exception = null; workerThreadException = null; ManualResetEventSlim ready = new ManualResetEventSlim(false); Thread windowThread = new Thread( () => { try { window = new DispatchWpfObject(ready); window.Show(); Dispatcher.Run(); Dispatcher.ExitAllFrames(); } catch (Exception e) { exception = e; throw; } }); windowThread.SetApartmentState(ApartmentState.STA); windowThread.Start(); ready.Wait(); ready.Reset(); try { action(window); } catch (Exception e) { workerThreadException = e; } ready.Wait(); Thread.Sleep(10); // wait for exception window.Dispatcher.InvokeShutdown(); windowThread.Join(); uiThreadException = exception; }
private static void RunInWpfWindow(Action<DispatchWpfObject> action, out Exception uiThreadException, out Exception workerThreadException) { DispatchWpfObject window = null; Exception exception = null; workerThreadException = null; ManualResetEventSlim ready = new ManualResetEventSlim(false); Thread windowThread = new Thread( () => { try { window = new DispatchWpfObject(ready); window.Show(); Dispatcher.Run(); Dispatcher.ExitAllFrames(); } catch (Exception e) { exception = e; throw; } }); windowThread.SetApartmentState(ApartmentState.STA); windowThread.Start(); ready.Wait(); ready.Reset(); try { action(window); } catch ( Exception e ) { workerThreadException = e; } ready.Wait(); Thread.Sleep( 10 ); // wait for exception window.Dispatcher.InvokeShutdown(); windowThread.Join(); uiThreadException = exception; }