如何从C#中的其他线程更新列表?

时间:2017-08-04 03:02:01

标签: c# wpf multithreading timer

我正在开发一个WPF应用程序,其中ViewModel定期检查数据源以确定是否需要更改列表的内容。如果ViewModel意识到数据已更改,则会更新列表并更新相应的视图。

但是,我正在努力让更新机制发挥作用。在我的ViewModel中,我声明了一个计时器对象。我将此计时器设置为1秒间隔,将我的一个ViewModel方法订阅到该事件,然后启动计时器。

当计时器触发并尝试更改列表时,我收到“System.NotSupportedException”

This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.

所以我正在寻找解决这个问题的方法。我对C#比较陌生,但想到了可能的解决方案:

  • 让我的viewmodel实现一个'run'方法,在该方法中它只是无限循环,并轮询通过timer elapsed事件设置的成员布尔值。但是,这种方法看起来很糟糕。

  • 查找支持多线程访问的备用列表对象。但是,我没有意识到这样的课程。

由于我是C#的新手,我也可能错过了明显的解决方案。

我很感激任何想法!

最小代码:

 public class ConnectionPresenter : ObservableObject
 {
      /* private */
      private readonly ObservableCollection<string> _connectedUsers = new ObservableCollection<string> { "Bob" };
      Timer _updateTimer = new Timer(1000);


      public ConnectionPresenter()
      {
           _updateTimer.Elapsed += this.CheckConnections;
           _updateTimer.AutoReset = true;
           _updateTimer.Start();
      }

      private void CheckConnections(object sender, ElapsedEventArgs e)
      {
           _connectedUsers.Add("Bob");
      }

 }

1 个答案:

答案 0 :(得分:0)

这可能适用于您的情况:

 private void CheckConnections(object sender, ElapsedEventArgs e)
 {
      App.Current.Dispatcher.Invoke(() => _connectedUsers.Add("Bob"));
 }