我已经从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();
答案 0 :(得分:6)
Stack Overflow上有很多重复的问题。例如,this question。
底线 - 无论何时创建UI组件,都必须使用单线程单元(STA)线程。后台工作者不是STA。因此,您无法在后台工作程序中创建UI组件。您无法从后台工作程序更新UI组件。后台工作程序被设计为在后台运行 (那里很惊讶),可能会破坏数据并稍后返回结果。
答案 1 :(得分:4)
我认为您需要使用Application.Current.Dispatcher.BeginInvoke(action)
。这是从后台线程更新UI。