2011-12-08 21 views
1

IソースINotifyPropertyChangedを実装するオブジェクトをcotainsそのBindingListに設定されているBindingSourceに設定され、そのソースとDataGridViewを有します。問題は、私のBindingListの項目を更新するロジックが別のスレッドで実行されることです。すべてが絶対にうまくいきますが、なぜそれが全く機能しないのか分かりません。クロススレッドアクセスを処理するためのロジックはありますか?この場合、正しいアプローチは何ですか?のBindingSource、するBindingList、DataGridViewのクロススレッドのアクセス

BindingSource _actionsBindingSource; // it's DGV's source 
BindingList<IAction> _actionsList = ...; 
... 
interface IAction : INotifyPropertyChanged 
{ 
    ... 
} 
... 
actionsBindingSource.DataSource = _actionsList; 
... 
public void FireActions() 
{ 
    new Thread(() => 
    { 
    foreach (IAction action in _actionsList) 
    { 
     action.Execute(); // fires some PropertyChangedEventArgs events from non-UI thread 
    } 
    }).Start();  
} 

私のFireActions()メソッドに興味があります。

答えて

0

別のスレッドを使用する代わりにUIスレッドでコードを実行することをお勧めします。データがバインディングソースを変更しているときに、最終的にブラインドコントロールが変更されるという問題。したがって、UIスレッドを使用してワーカースレッドではなくデータをロードする必要があります。

たとえば、BindingSourceはDataTableにリンクし、DataGridはBindingSourceにバインドします。 DataTableにデータを読み込むためにワーカースレッドを使用しないと、UIスレッドのロックを避けることができます。ただし、BindingSourceはUI操作であるDataGridを最終的に更新する必要があるため、これは機能しません。

関連する問題