Trong ứng dụng wpf của tôi, hoạt động tốn thời gian trong viewmodel của tôi được gọi bằng cách sử dụng một luồng riêng biệt. Tuy nhiên, hàm này truy cập một số thuộc tính trong khung nhìn được gắn với các đối tượng trong khung nhìn. Tôi đã thử truy cập chúng trực tiếp và tôi thấy không có khiếu nại về chúng được sở hữu bởi các chủ đề giao diện người dùng. Tôi quan tâm đến việc biết hậu quả của việc sử dụng chúng trực tiếp giữa các chủ đề.Truy cập các thuộc tính ViewModel từ chủ đề riêng biệt
Trả lời
Bạn được tự do sử dụng ViewModel của mình từ bất kỳ chủ đề nào - bao gồm đọc và viết. Ngoại lệ chính là giao dịch với các bộ sưu tập - các bộ sưu tập dữ liệu bị ràng buộc phải được ghi vào chủ đề giao diện người dùng, vì ràng buộc không tự động so sánh với luồng giao diện người dùng (như các ràng buộc đơn giản).
Tuy nhiên, bạn vẫn nên cân nhắc việc có đồng bộ hóa phù hợp tại chỗ cho mọi lần viết. Các vấn đề đồng bộ hóa luồng thông thường sẽ xảy ra, vì ViewModel chỉ là một lớp khác.
Điều đó đang được nói, thông thường, bạn sẽ muốn xử lý đồng bộ hóa hơi khác với bạn trong nhiều trường hợp. Ổ khóa thường không hoạt động trên ViewModel, vì ràng buộc dữ liệu WPF sẽ không khóa các đối tượng. Như vậy, bạn thường nên sử dụng Dispatcher.Invoke
/BeginInvoke
để sắp xếp lại cuộc gọi trở lại luồng giao diện người dùng khi cần khi đồng bộ hóa được yêu cầu trong ViewModel.
Ví dụ: nếu tôi có 'ToggleButton' được liên kết với' bool' trong VM. Và tôi đang làm một 'if (bool)' trong một chuỗi riêng biệt, tôi sẽ phải làm gì để duy trì đồng bộ hóa ở đây để không có xung đột giữa người dùng thiết lập chuyển đổi và nếu điều kiện thực hiện. – Aks
@Aks No. Nếu bạn chỉ đọc một giá trị như vậy, bạn sẽ không gặp vấn đề gì. Điều đó đang được nói, có lẽ bạn nên (kỹ thuật) đánh dấu bool dễ bay hơi. Để biết chi tiết, hãy xem: http://stackoverflow.com/questions/458173/can-ac-sharp-thread-really-cache-a-value-and-ignore-changes-to-that-value-on-ot/458193 # 458193 –
Không có hậu quả nào ngoài những lo ngại về an toàn chủ đề thông thường của bạn. Điều duy nhất thường gặp sự cố với các mức độ phù hợp của VM là ObservableCollections
có mối quan hệ luồng.
Nếu tôi thực sự sử dụng khóa, không phải là chuỗi giao diện người dùng bị treo? – Aks
Điều này đúng - nhưng "mối quan tâm an toàn chủ đề thông thường" có xu hướng yêu cầu cách giải quyết khác thường, vì WPF sẽ bỏ qua bất kỳ khóa hoặc đồng bộ hóa chuỗi tiêu chuẩn nào bạn cố gắng sử dụng. –
Nếu bạn sử dụng mở rộng ObservableCollection của bạn với điều này, bạn có thể cập nhật từ một thread riêng biệt:
/// <summary>
/// Source: New Things I Learned
/// Title: Have worker thread update ObservableCollection that is bound to a ListCollectionView
/// http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx
/// Note: Improved for clarity and the following of proper coding standards.
/// </summary>
/// <param name="e"></param>
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
// Use BlockReentrancy
using (BlockReentrancy())
{
var eventHandler = CollectionChanged;
// Only proceed if handler exists.
if (eventHandler != null)
{
Delegate[] delegates = eventHandler.GetInvocationList();
// Walk thru invocation list
foreach (NotifyCollectionChangedEventHandler handler in delegates)
{
var currentDispatcher = handler.Target as DispatcherObject;
// If the subscriber is a DispatcherObject and different thread
if ((currentDispatcher != null) &&
(currentDispatcher.CheckAccess() == false))
{
// Invoke handler in the target dispatcher's thread
currentDispatcher.Dispatcher.Invoke(
DispatcherPriority.DataBind, handler, this, e);
}
else
{
handler(this, e);
}
}
}
}
}
/// <summary>
/// Overridden NotifyCollectionChangedEventHandler event.
/// </summary>
public override event NotifyCollectionChangedEventHandler CollectionChanged;
- 1. Truy cập Bộ nhớ Cache ASP.NET từ một Chủ đề Riêng biệt?
- 2. Truy cập điều khiển của biểu mẫu từ một chủ đề riêng biệt
- 3. force get/set truy cập các biến riêng tư cho các thuộc tính riêng
- 4. Truy cập thuộc tính masterpage từ usercontrol
- 5. Truy cập các giao diện từ chủ đề khác (Android)
- 6. Thực hiện các nhóm chủ đề riêng biệt trong jmeter
- 7. Email trên các chủ đề riêng biệt trong php
- 8. Quyền bị từ chối truy cập thuộc tính 'href'
- 9. Tệp thuộc tính dot các tên khóa riêng biệt
- 10. Đặt một NSTimer vào một chủ đề riêng biệt
- 11. trong Mục tiêu-C, cách truy cập thuộc tính riêng tư từ danh mục
- 12. Mục tiêu-C: truy cập các thuộc tính riêng trong lớp thừa kế
- 13. MySQL: Cách tính từ các cột riêng biệt?
- 14. Truy cập thuộc tính IFrame tên miền chéo từ JavaScript
- 15. Mẫu C++ Crazy - Một mẫu để truy cập các thuộc tính riêng lẻ của một lớp
- 16. MVVM ViewModel rất nhiều thuộc tính
- 17. Truy cập thuộc tính mục tiêu-C
- 18. Cách truy cập các thuộc tính đối tượng có chứa các ký tự đặc biệt?
- 19. Truy cập vào IndexedDB từ nhiều chủ đề javascript
- 20. Tại sao một số đối tượng không thể truy cập từ các chủ đề khác nhau?
- 21. Biến truy cập từ một lớp khác từ một chủ đề
- 22. Truy cập các thuộc tính mô hình trong Rails
- 23. XAML liên kết thuộc tính BitmapImage ViewModel
- 24. Chạy biểu mẫu Tkinter trong một chủ đề riêng biệt
- 25. C# winform: Truy cập các thuộc tính công khai từ các biểu mẫu khác và khác biệt giữa thuộc tính tĩnh và công khai
- 26. Truy cập các tệp thuộc tính bên ngoài .jar?
- 27. Truy cập các thuộc tính tĩnh trong Sencha Touch
- 28. C# truy cập các giá trị thuộc tính động theo tên thuộc tính
- 29. Truy cập các vai trò từ thuộc tính ủy quyền tùy chỉnh
- 30. Truy cập các thành viên riêng
Bạn đang chuyển 'ViewModel' hoặc chỉ đọc nó đề riêng biệt? – SliverNinja
chỉ là các chủ đề riêng biệt – Aks