【问题标题】:How can I update a list from a different thread in C#? [duplicate]如何从 C# 中的不同线程更新列表? [复制]
【发布时间】:2017-08-04 11:07:56
【问题描述】:

我正在开发一个 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# 比较陌生,但想到了一个可能的解决方案:

  • 让我的视图模型实现一个“运行”方法,在该方法中,它只是无限期地循环并轮询通过计时器经过事件设置的成员布尔值。但是,这种方法看起来很hacky。

  • 查找支持多线程访问的替代列表对象。但是,我不知道有这样的课程。

由于我是 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");
      }

 }

【问题讨论】:

  • 我在手机上,但要查找调度员
  • 它会像 Dispatcher.Run 然后是 lambda 表达式,然后是你已经拥有的代码。
  • 你应该找到更好的搜索引擎来使用......谷歌或bing.com/…应该没问题。我建议不要在 disney.com 这样的网站上使用搜索来解决编程问题。如果搜索结果没有帮助 - 请确保 edit 您的问题与您尝试过的事情(即从我选择的重复项)以及它如何没有解决问题。
  • 我在手机上,所以嗯,但试试这个只是替换中间的代码。 Dispatcher.Invoke(() => { btn1.Content = "通过调用"; });
  • 私有对象_lock = new object(); BindingOperations.EnableCollectionSynchronization(_connectedUsers, _lock);是更好的解决方案

标签: c# wpf multithreading timer


【解决方案1】:

这可能适用于您的情况:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多