Лучший способ решить эту проблему - передать объект Dispatcher
методу запуска фонового потока.
void DoBackgroundOperation(ObservableCollection<SomeType> col) {
var dispatcher = Dispatcher.CurrentDispatcher;
ThreadStart start = () => BackgroundStart(dispatcher, col);
var t = new Thread(start);
t.Start();
}
private static void BackgroundStart(
Dispatcher dispatcher,
ObservableCollection<SomeType> col) {
...
SomeType t = GetSomeTypeObject();
Action del = () => col.Add(t);
dispatcher.Invoke(del);
}
Теперь позже, когда вам нужно добавить в коллекцию, вы можете использовать объект UI Dispatcher
.
Как указал @Reed, более общее решение достигается с помощью SynchronizationContext
. Вот пример функционального стиля с использованием SynchronizationContext
для создания делегата, ответственного за добавление новых значений. Это имеет преимущество в том, что скрывает как коллекцию, так и модель потоков от кода, создающего объект.
void DoBackgroundOperation(ObservableCollection<SomeType> col) {
var context = SynchronizationContext.Current;
Action<SomeType> addFunc = (SomeType st) => context.Send(() => col.Add(st), null);
ThreadStart start = () => BackgroundStart(addFunc);
var t = new Thread(start);
t.Start();
}
private static void BackgroundStart(Action<SomeType> addFunc) {
...
SomeType t = GetSomeTypeObject();
addFunc(t);
}