私は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. 別のクラスの別のスレッドからUIを更新する
- 2. メインスレッドのテキストボックスを別のスレッドから更新するには?
- 3. アンドロイドの別のスレッドからuiを更新する
- 4. 別のスレッドからコントロールを更新するには?
- 5. 別のメインでないスレッドからQGraphicsSceneを更新する
- 6. 別のスレッドから進捗バーを更新する
- 7. プログレスバーの値を別のスレッドから更新しますか?
- 8. WPF - 別のスレッドから "System.Windows.Controls.Image"を更新します
- 9. スレッドをUIから更新する
- 10. WPFのObservableCollectionコンテンツを更新する
- 11. 別のクラスの別のスレッドからJavaFX GUIを変更する
- 12. 別のスレッドからNSCollectionViewを更新すると空白になる
- 13. PySide:別のスレッドからGUIを簡単に更新する方法
- 14. 更新パネルを別のフォームから更新する()
- 15. 外部UIスレッドからgridviewを更新
- 16. 別のスレッドでTWebBrowserを更新しますか?
- 17. アンドロイドサービスの別のスレッドで位置更新を実行する
- 18. 別のクラスのスレッドからラベルフォームを変更する
- 19. テキストボックスを別のスレッドのクラスから更新してください
- 20. ObservableCollectionがリストビューを更新しない
- 21. ObservableCollection FileSystemWatcher ListBox更新の問題
- 22. 他のスレッドからSWTオブジェクトを更新する
- 23. iOSの非UIスレッドからUIラベルを更新する方法
- 24. 他のスレッドからUIを更新する
- 25. 他のスレッドからUIを更新する
- 26. C#別のクラスからTextBoxを更新
- 27. 異なるスレッドから毎秒リストビューを更新する
- 28. gtkmm:他のスレッドからguiを更新しますか?
- 29. EntityFrameworkでWPF ObservableCollectionのマスターディテールアイテムを更新する
- 30. 代替スレッドからの変更で他のコンテキストを更新する方法
可能重複(http://stackoverflow.com/questions/2104614/updating-an-observablecollection-in-a-separate-thread ) –
任意のスレッドから動作し、複数のUIスレッドを介してバインドできるスレッドセーフソリューションを提供する次のリンクを試してください。http://www.codeproject.com/Articles/64936/Multithreaded-ObservableImmutableCollection – Anthony