WPF和后台工作者以及调用线程必须是STA

时间:2014-01-12 17:10:05

标签: c# .net wpf

我已经从Stack Overflow问题 Implement progressbar in this simple WPF application 实施了解决方案。

MainWindow有自己的viewmodel。在该视图模型中,我接收用户的输入并使用后台工作程序使用WCF服务。在WCF提供数据后,我正在尝试在新窗口中显示它。这是发生错误的地方:

  

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

我尝试将[STAThread]属性放在MainWindow code-behind以及MainWindowViewModel构造函数内。在这两种情况下都没有改变。

我错过了什么?

更新 用户在viewmodel中单击命令后调用LoadData方法

private void LoadData(string searchBy)
{
    IsBusy = true;
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += (o, ea) =>
    {
        switch (searchBy)
        {
            // WCF call to load data
        }
    }

    worker.RunWorkerCompleted += (o, ea) =>
    {
       IsBusy = false;
    };

    worker.RunWorkerAsync();

2 个答案:

答案 0 :(得分:6)

Stack Overflow上有很多重复的问题。例如,this question

底线 - 无论何时创建UI组件,都必须使用单线程单元(STA)线程。后台工作者不是STA。因此,您无法在后台工作程序中创建UI组件。您无法从后台工作程序更新UI组件。后台工作程序被设计为在后台运行 (那里很惊讶),可能会破坏数据并稍后返回结果。

答案 1 :(得分:4)

我认为您需要使用Application.Current.Dispatcher.BeginInvoke(action)。这是从后台线程更新UI。