私はRxライブラリでハンドルを取得しようとしていて、MVVMでWPFで処理しています。私はアプリケーションをリポジトリやViewModelなどのコンポーネントに分割しました。私のリポジトリは、学生のコレクションを1つずつ提供することができますが、ビューバインドObservableCollectionに追加しようとすると、スレッドエラーがスローされます。私はこれを私のために働かせるためにいくつかのポインタを謝るつもりです。別のスレッドからObservableCollectionを更新する
答えて
あなたは正しく例えば
ObserveOn(SynchronizationContext.Current)
このブログ記事を参照してください
を使用して、同期コンテキストを設定する必要があります。
<Page.Resources>
<ViewModel:ReactiveListViewModel x:Key="model"/>
</Page.Resources>
<Grid DataContext="{StaticResource model}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Content="Start" Command="{Binding StartCommand}"/>
<ListBox ItemsSource="{Binding Items}" Grid.Row="1"/>
</Grid>
public class ReactiveListViewModel : ViewModelBase
{
public ReactiveListViewModel()
{
Items = new ObservableCollection<long>();
StartCommand = new RelayCommand(Start);
}
public ICommand StartCommand { get; private set; }
private void Start()
{
var observable = Observable.Interval(TimeSpan.FromSeconds(1));
//Exception: This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.
//observable.Subscribe(num => Items.Add(num));
// Works fine
observable.ObserveOn(SynchronizationContext.Current).Subscribe(num => Items.Add(num));
// Works fine
//observable.ObserveOnDispatcher().Subscribe(num => Items.Add(num));
}
public ObservableCollection<long> Items { get; private set; }
}
このメソッドはifコードはXamlsコードの背後にありますが、私はエンティティを追加するためにViewModelが必要です。私のソースは、ViewModelから呼び出される非同期サービスです。その時、SynchronitaionContext.CurrentはViewModelの値を持っていません –
私のために働く例を追加しました。 NuGet経由でRx-MainとRx-WPFを追加しました。 – Phil
私のコードは多かれ少なかれ同じですが、私のコレクションのフェッチと割り当てはコンストラクタで起こります。また、クラスを解決するためにUnityを使用しています。私はここに詳細なコードを追加しましたhttp://stackoverflow.com/questions/9377290/synchronizationcontext-current-is-null-on-resolving-with-unity-in-wpf –
コードはバックグラウンドスレッドで実行されていますか? UIに影響するため、ViewバインドObservableCollectionはUI /ディスパッチャスレッドでのみ更新できます。
同様の問題については、WPF ObservableCollection Thread Safetyを参照してください。
UIへの変更がDispatcher
スレッドで実行する必要があります:
は、ここで私の作品例です。ビューモデルを常に変更するanthoerスレッドがある場合は、プロパティーセッターにディスパッチャースレッドを使用させることをお勧めします。この場合、別のスレッドでUI要素を変更しないようにします。
試行:[別のスレッドでのObservableCollectionを更新]の
public string Property
{
set
{
Dispatcher.BeginInvoke(()=> _property = value) ;
OnPropertyChanged("Property");
}
get
{
return _property;
}
}
- 1. 別のサイト/更新ボタンでObservableCollectionを更新する
- 2. 別のクラスの別のスレッドからUIを更新する
- 3. WPFの別のスレッドからImage.sourceを更新する
- 4. アンドロイドの別のスレッドからuiを更新する
- 5. メインスレッドのテキストボックスを別のスレッドから更新するには?
- 6. C#別のクラス/スレッドからUIを更新する
- 7. 別のスレッドから進捗バーを更新する
- 8. 別のスレッドからオキシプロットモデルを更新する
- 9. 別のスレッドからコントロールを更新するには?
- 10. 別のメインでないスレッドからQGraphicsSceneを更新する
- 11. プログレスバーの値を別のスレッドから更新しますか?
- 12. WPF - 別のスレッドから "System.Windows.Controls.Image"を更新します
- 13. スレッドをUIから更新する
- 14. WPFのObservableCollectionコンテンツを更新する
- 15. 別のスレッドからのUIの更新(時間の経過)
- 16. 別のクラスの別のスレッドからJavaFX GUIを変更する
- 17. ObservableCollectionを更新するには?
- 18. 別のスレッドからNSCollectionViewを更新すると空白になる
- 19. ループ内のJLabelを別のスレッドから連続的に更新する
- 20. WebアプリケーションUIを別のスレッド(ASP.NETとC#)のIPコールバックから更新する
- 21. c#ソケットのObservableCollectionを更新します
- 22. PySide:別のスレッドからGUIを簡単に更新する方法
- 23. アンドロイドビューは別のクラスと別のスレッドから更新されていません
- 24. UIの更新コードからのスレッド
- 25. スレッドからの配列の更新
- 26. 更新パネルを別のフォームから更新する()
- 27. 外部UIスレッドからgridviewを更新
- 28. 別のスレッドでTWebBrowserを更新しますか?
- 29. GUIのラベルを別のクラスのスレッドから変更する
- 30. 別のクラスのスレッドからラベルフォームを変更する
可能重複(http://stackoverflow.com/questions/2104614/updating-an-observablecollection-in-a-separate-thread ) –
任意のスレッドから動作し、複数のUIスレッドを介してバインドできるスレッドセーフソリューションを提供する次のリンクを試してください。http://www.codeproject.com/Articles/64936/Multithreaded-ObservableImmutableCollection – Anthony