2017-08-04 7 views
0

私はViewModelが定期的にデータソースをチェックしてリストの内容を変更する必要があるかどうかを判断するWPFアプリケーションを開発しています。 ViewModelがデータが変更されたことを認識すると、リストが更新され、対応するビューが更新されます。C#の別のスレッドからリストを更新するにはどうすればよいですか?

しかし、私は更新メカニズムを動作させるのに苦労しています。私のViewModel内で、私はタイマーオブジェクトを宣言します。このタイマーを1秒間隔に設定し、ViewModelメソッドの1つをイベントに登録して、タイマーを開始します。

すると、タイマーのトリガーと私はリストを変更しようとすると、私は、だから私はこれを回避する方法を探しています「System.NotSupportedException」

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

を取得します。私はC#に比較的新しいですが、ビュー可能な解決策を考えています

  • 私のviewmodelは「RUN」メソッドを実装している中、それだけでしばらく無限にループや世論調査を経て設定されているメンバーのブール値をタイマー経過イベント。しかし、この方法はハッキリと思われる。

  • マルチスレッドアクセスをサポートする代替リストオブジェクトを検索します。しかし、私はそのようなクラスを知らない。

私は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"); 
     } 

} 
+0

私は携帯の午前が、ディスパッチャを検索 –

+0

それはその後Dispatcher.Runのようなもの、その後、ラムダ式を移動しますあなたがすでに持っているコード。 –

+0

あなたはより良い検索エンジンを使用する必要があります... googleかhttps://www.bing.com/search?q=from+a+thread+different+from+the+Dispatcher+threadのどちらでも問題ありません。私はプログラミングの質問のためにhttps://www.disney.com/のようなサイトで検索を使用することをお勧めします。検索結果のいずれにも役立たない場合は、試したこと(つまり、私が選択した重複から)で問題を解決できなかったことを確認してください。 –

答えて

0

これはあなたのケースのために働くかもしれない:

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