1

In my desktop application i want to open view in BackgroundWorker to show reminder. but when i try to open view it gives me the following error. "The calling thread must be STA, because many UI components require this." and stackTrace is

 at System.Windows.Input.InputManager..ctor()
   at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
   at System.Windows.Input.KeyboardNavigation..ctor()
   at System.Windows.FrameworkElement.FrameworkServices..ctor()
   at System.Windows.FrameworkElement.EnsureFrameworkServices()
   at System.Windows.FrameworkElement..ctor()
   at System.Windows.Controls.Control..ctor()
   at System.Windows.Window..ctor()
   at MahApps.Metro.Controls.MetroWindow..ctor()

can anyone have solution?

  • 2
    possible duplicate of [The calling thread must be STA, because many UI components require this](http://stackoverflow.com/questions/2329978/the-calling-thread-must-be-sta-because-many-ui-components-require-this) – Clemens Jun 26 '13 at 07:50

1 Answers1

0

you can do this in this manner:

    private BackgroundWorker _BgWorker;


    public Window1()
    {
        InitializeComponent();

        _BgWorker = new BackgroundWorker();
        _BgWorker.DoWork += new DoWorkEventHandler(bgw_DoWork);
        _BgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
    }

void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        ///your code to get the data from database...
    }

void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      //you code to open a view
    }

Use this in the Runworker completed

Thread Messagethread = new Thread(
        new ThreadStart(delegate()
        {
            DispatcherOperation DispacherOP = frmMassenger.Dispatcher
                .BeginInvoke(DispatcherPriority.Normal, new Action(
                    delegate()
                    {
                        frmMassenger.Show();
                    }
            ));
        } ));
        Messagethread.Start();

later you join the Thread with main thread using:

Thread.join(userthread);

Hope This will help you.

Krish
  • 376
  • 1
  • 10
  • 1
    It only works to open view one time.As i am using timer to run background worker after 20 sec it gives me same error @Krish –  Jun 26 '13 at 10:21
  • it gives me Exception of NullRefernce at frmMassenger.Dispatcher and i can create instance of my view as my main exception occurs..@Krish –  Jun 26 '13 at 11:00
  • It works after replacing frmMassenger.Dispatcher to Dispatcher and i can open view as per timers interval. Thanx for help –  Jun 26 '13 at 11:05