【问题标题】:WPF - Download Data in Background an update Objects bound to UIWPF - 在后台下载数据和绑定到 UI 的更新对象
【发布时间】:2010-12-18 15:22:24
【问题描述】:

我有一个 ObservableCollection,它绑定到我的视图中的 ListBox。 在我的 ViewModel 中是一个命令。在此命令中,我想更新所有 MyObjects。

示例代码:

foreach(MyObject in List)
myobject.Prop = HelperClass.downloadData();

downloaddata 函数需要一些时间...

当我运行命令几分钟后,什么也没有发生……突然,视图更新了。

有人可以帮我吗?

谢谢

【问题讨论】:

标签: wpf multithreading data-binding


【解决方案1】:

在执行 GUI 应用程序时,负责绘制视图的线程与运行事件的线程相同,因此如果您在事件中阻塞此线程,则 UI 将冻结,请尝试使用后台工作者:

BackgroundWoker bg = new BackGroundWorker();

bg.DoWork += (sender,args) =>
{

foreach(MyObject in List)
myobject.Prop = HelperClass.downloadData();
};
bg.RunWorkerAsync();

BackgroundWorker 在释放 UI 线程的不同线程中完成您的工作。 如果此代码没有更改 UI 上的任何内容,您可以简单地将工作项排队到线程池中。

【讨论】:

  • 这不起作用...我收到错误:必须在与 DependencyObject 相同的线程上创建 DependencySource。
  • 您需要在 UI 线程中创建后台工作程序,以便它复制 UI 的线程执行上下文以对其进行更改。
  • 在调用 window.show() 之后,我在主代码隐藏文件中创建了 worker :(
  • 确保你没有从后台线程中更新 ObservableCollection - 你不能这样做。如果您想从 UI 线程外部更新 ObservableCollection,请使用 Dispatcher(例如 App.Current.Dispatcher.Invoke(() => { collection.Add(whatever); }); )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多