如何在后台线程中创建WPF控件?

Pol*_*ris 10 c# wpf multithreading backgroundworker

我有创建后台线程的方法来做一些动作.在这个后台线程中我创建了对象.但是在运行时创建时这个对象给了我一个例外:

调用线程必须是STA,因为许多UI组件都需要这个.

我知道我必须使用Dispatcher来反映UI的内容.但在这种情况下,我只是创建一个对象,而不是用UI迭代.这是我的代码:

    public void SomeMethod()
      {
         BackgroundWorker worker = new BackgroundWorker();
         worker.DoWork += new DoWorkEventHandler(Background_Method);
         worker.RunWorkerAsync();
      }

   void Background_Method(object sender, DoWorkEventArgs e)
      {
         TreeView tv = new TreeView();
      }
Run Code Online (Sandbox Code Playgroud)

如何在后台线程中创建对象?

我使用WPF应用程序

Dea*_*ing 6

TreeView是一个UI控件.您只能在UI线程上创建和操作UI控件,因此您无法尝试执行的操作.

你想要做的是在后台线程上完成所有耗时的工作,然后"回调"到UI线程来操作UI.这实际上非常简单:

void Background_Method(object sender, DoWorkEventArgs e)
{
    // ... time consuming stuff...

    // call back to the window to do the UI-manipulation
    this.BeginInvoke(new MethodInvoker(delegate {
        TreeView tv = new TreeView();
        // etc, manipulate
    }));
}
Run Code Online (Sandbox Code Playgroud)

我可能有错误的语法BeginInvoke(它不在我的脑海中),但无论如何你去了...