Cách tốt nhất để giải quyết vấn đề này là chuyển đối tượng Dispatcher
đến phương pháp bắt đầu của chuỗi nền.
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);
}
Bây giờ sau này khi bạn cần thêm vào bộ sưu tập, bạn có thể sử dụng đối tượng UI Dispatcher
.
Khi @Reed chỉ ra, một giải pháp tổng quát hơn là đạt được bằng cách sử dụng SynchronizationContext
. Dưới đây là mẫu kiểu chức năng sử dụng SynchronizationContext
để tạo đại biểu chịu trách nhiệm thêm các giá trị mới. Điều này có lợi thế là ẩn cả bộ sưu tập và mô hình luồng từ mã tạo đối tượng.
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);
}
Cá nhân tôi không thể làm cho nó hoạt động với các liên kết được cung cấp. Tôi cần sử dụng cách tiếp cận của JaredPas'a mà bạn đã đề cập. –
Hãy thử liên kết sau đây cung cấp giải pháp an toàn chủ đề hoạt động từ bất kỳ chuỗi nào và có thể bị ràng buộc bởi nhiều chuỗi giao diện người dùng: http://www.codeproject.com/Articles/64936/Multithreaded-ObservableImmutableCollection – Anthony
Bài viết bạn tham chiếu AnthonyPaulO yêu cầu gói NuVet không thể thay đổi bộ sưu tập và chỉ hoạt động với .NET4.5. Có bất cứ điều gì tương tự xung quanh cho. NET4.0? – Dave