How do I open a window on a new thread? How do I open a window on a new thread? multithreading multithreading

How do I open a window on a new thread?


You need to call Show() on the same thread that the window is created on - that's why you are getting the error. Then you also need to start a new Dispatcher instance to get the runtime to manage the window.

private void launchViewerThread_Click(object sender, RoutedEventArgs e){    Thread viewerThread = new Thread(delegate()    {        viewer = new SkeletalViewer.MainWindow();        viewer.Show();        System.Windows.Threading.Dispatcher.Run();    });    viewerThread.SetApartmentState(ApartmentState.STA); // needs to be STA or throws exception    viewerThread.Start();}

See the Multiple Windows/Multiple Threads example at: http://msdn.microsoft.com/en-us/library/ms741870.aspx


So I was running into a similar issue where a new window failed to open on a new thread. The exception was "cannot use a dependencyobject that belongs to a different thread".

The issue ended up being that the window was using a global resource (Background brush). Once I froze the brush resource, the window loaded just fine.


I am not sure if this will solve your problem but can you try creating a thread proc (to open a viewer window) which is executed on a different thread and then have a dispatcher.beginInvoke to update the main window ,

Here is some code-

    in the constructor register this    public MainWindow()    {        UpdateColorDelegate += UpdateColorMethod;    }     // delegate and event to update color on mainwindow     public delegate void UpdateColorDelegate(string colorname);    public event UpdateColorDelegate updateMainWindow;    // launches a thread to show viewer    private void launchViewerThread_Click(object sender, RoutedEventArgs e)    {        Thread t = new Thread(this.ThreadProc);        t.Start();    }    // thread proc    public void ThreadProc()    {       // code for viewer window       ...       // if you want to access any main window elements then just call DispatchToMainThread method       DispatchToUiThread(color);       }     //     private void DispatchToUiThread(string color)    {      if (updateMainWindow != null)      {        object[] param = new object[1] { color};        Dispatcher.BeginInvoke(updateMainWindow, param);      }    }    // update the mainwindow control's from this method    private void UpdateColorMethod(string colorName)    {       // change control or do whatever with main window controls    } 

With this you can update the main window controls without freezing it, Let me know if you have any questions