【问题标题】:Updating ObservableCollection on dispatcher thread causes UI to freeze在调度程序线程上更新 ObservableCollection 会导致 UI 冻结
【发布时间】:2013-04-20 16:07:38
【问题描述】:

更新我的ObservableCollection 时,我收到了这个错误:

这种类型的 CollectionView 不支持对其进行更改 SourceCollection 来自与 Dispatcher 线程不同的线程。

使用this answer 作为指导,我认为这段代码可以工作:

private ObservableCollection<string> _userMessages = new ObservableCollection<string>();

public void AddUserMessage(string message)
{
    lock (_locker)
    {
        Action action = () =>
        {
            this._userMessages.Add(message);
        };

        Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, action);
    }
}

但是,当调用 Dispatcher.Invoke() 时,我的 UI 现在会冻结。我做错了什么?

注意:我需要这样做,因为我(有时)会从事件中更新我的 ObservableCollection

【问题讨论】:

  • userMessages.CollectionChanged 中发生了什么?
  • @Filip 我没有覆盖ObservableCollection 中的任何功能。

标签: c# multithreading events


【解决方案1】:

试试这个:

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, action);

您同步调用您的操作,这会导致 UI 冻结。

【讨论】:

  • 是的,但它在很大程度上否定了这里使用lock()
猜你喜欢
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2013-02-17
  • 2018-02-25
相关资源
最近更新 更多