バックグラウンド ワーカーから UI コントロールにアクセスすることはできません。通常は、BackgroundWorker.RunWorkerAync() を呼び出す前に IsBusy を true に設定し、BackgroundWorker.RunWorkerCompleted イベント ハンドラで IsBusy を false に設定します。次のようなものです:
Backgroundworker worker = new BackgroundWorker();
worker.DoWork += ...
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
IsBusy = false;
};
IsBusy = true;
worker.RunWorkerAsync();
Dispatcher を使用して、DoWork イベント ハンドラ内で ObservableCollection に項目を追加できます。
編集:ここに完全な解決策があります
private void Button_Click(object sender, RoutedEventArgs e)
{
//on UI thread
ObservableCollection<string> collection;
ThreadStart start = delegate()
{
List<string> items = new List<string>();
for (int i = 0; i < 5000000; i++)
{
items.Add(String.Format("Item {0}", i));
}
System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
{
//propogate items to UI
collection = new ObservableCollection<string>(items);
//hide indicator
_indicator.IsBusy = false;
}));
};
//show indicator before calling start
_indicator.IsBusy = true;
new Thread(start).Start();
}