プラットホーム:WPF, .NET 4.0, C# 4.0
問題:Mainwindow.xamlに、現在ObservableCollection<Customer>であるCustomerコレクションにバインドされたListBoxがあります。
ObservableCollection<Customer> c = new ObservableCollection<Customer>();
このコレクションは、FileSystem、WebServiceなどの複数のソースを介して更新できます。
顧客の並列ロードを可能にするために、ヘルパークラスを作成しました
public class CustomerManager(ref ObsevableCollection<Customer> cust)
これは、顧客ソースごとに(Parallel Extensionsライブラリから)新しいタスクを内部的に生成し、顧客コレクションオブジェクトに新しいCustomerインスタンスを追加します(そのctorにrefによって渡されます)。
問題は、ObservableCollection <T>(またはそれに関するコレクション)をUIスレッド以外の呼び出しから使用できず、例外が発生することです。
「NotSupportedException–このタイプのCollectionViewは、Dispatcherスレッドとは異なるスレッドからのSourceCollectionへの変更をサポートしていません。」
使ってみました
System.Collections.Concurrent.ConcurrentBag<Customer>
コレクションですが、INotifyCollectionChangedインターフェイスを実装していません。したがって、私のWPFUIは自動的に更新されません。
それで、プロパティ/コレクション変更通知の両方を実装し、他の非UIスレッドからの呼び出しも許可するコレクションクラスはありますか?
私の最初のビング/グーグルでは、箱から出して提供されるものはありません。
編集:ConcurrentBag <Customer>を継承し、 INotifyCollectionChangedインターフェイスも実装する独自のコレクションを作成しました。しかし、驚いたことに、別々のタスクで呼び出した後でも、タスクが完了するまでWPFUIがハングします。タスクは並行して実行され、UIスレッドをブロックしないことになっていますか?
事前にご提案ありがとうございます。