Вы не можете получить доступ к элементам управления пользовательского интерфейса из фонового работника.Обычно вы устанавливаете IsBusy в значение true, прежде чем вызывать BackgroundWorker.RunWorkerAync (), затем в обработчике события BackgroundWorker.RunWorkerCompleted вы устанавливаете IsBusy в значение false.Примерно так:
Backgroundworker worker = new BackgroundWorker();
worker.DoWork += ...
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
IsBusy = false;
};
IsBusy = true;
worker.RunWorkerAsync();
Вы можете использовать Диспетчер для добавления элементов в ObservableCollection, находясь в обработчике событий DoWork.
РЕДАКТИРОВАТЬ : Вот полное решение
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();
}