Tôi đang sử dụng điều khiển trực quan trong dự án của tôi từ thư viện mà tôi không có nguồn.
Mất quá nhiều thời gian để cập nhật (200 mili giây) cho khả năng phản hồi giao diện người dùng tốt với ba trong số các điều khiển này trên màn hình cùng một lúc. (Tôi có thể cần phải cập nhật cả ba cùng một lúc, khiến giao diện người dùng của tôi bị kẹt cho ~ 600ms trong khi tất cả đều đang suy nghĩ).Chạy điều khiển WPF trong một chủ đề khác
Tôi đã đọc một số bài đăng về TaskSchedulers và bắt đầu điều tra các tính năng nhiệm vụ song song như một cách để chạy từng điều khiển trong chuỗi của riêng chúng. Nền tảng sẽ là đa lõi, vì vậy tôi muốn tận dụng lợi thế của việc xử lý đồng thời.
Vấn đề là tôi thậm chí không biết những gì tôi không biết gì về thế nào để đi về việc này, mặc dù ..
Có một mẫu thiết kế thích hợp để chạy một điều khiển trong một thread riêng biệt từ chủ đề giao diện người dùng chính trong WPF?
Cụ thể: đây là điều khiển bản đồ của bên thứ ba, khi được cấp vị trí mới hoặc mức thu phóng mất quá nhiều thời gian để vẽ lại (~ 200 mili giây). Có lẽ ba trong số những cập nhật này ở mức tối đa 4Hz - rõ ràng là chúng sẽ không theo kịp ..
Tôi đã đóng gói điều khiển WPF trong một usercontrol và cần chạy từng cá thể trong chuỗi riêng của nó, trong khi vẫn giữ lại đầu vào của người dùng (ví dụ như nhấp chuột).
CẬP NHẬT: trong khi tôi cảm thấy xung quanh để có giải pháp, tôi đã thực hiện các bước sau cho đến nay.
Chủ đề chính (Giao diện người dùng) của tôi sinh ra một chuỗi tạo cửa sổ mới chứa điều khiển được đề cập và xác định vị trí chính xác (để có vẻ như nó chỉ là điều khiển bình thường).
_leftTopThread = new Thread(() =>
{
_topLeftMap = new MapWindow()
{
WindowStartupLocation = WindowStartupLocation.Manual,
Width = leftLocation.Width,
Height = leftLocation.Height,
Left = leftLocation.X,
Top = leftLocation.Y,
CommandQueue = _leftMapCommandQueue,
};
_topLeftMap.Show();
System.Windows.Threading.Dispatcher.Run();
});
_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
đâu CommandQueue
là một Queue Thread-safe BlockingCollection để gửi lệnh vào bản đồ (di chuyển vị trí, vv).
Vấn đề bây giờ là tôi có thể hoặc
- có đầu vào người sử dụng do
System.Windows.Threading.Dispatcher.Run()
gọi - hoặc chặn trên CommandQueue, nghe cho các lệnh được gửi bởi các chủ đề chính
tôi không thể quay chờ lệnh, bởi vì nó sẽ hấp thụ tất cả các CPU thread của tôi!
Có thể chặn và máy bơm thông báo sự kiện có hoạt động không?
điều khiển Tất cả WPF phải được cập nhật trên thread UI. Tuy nhiên, chúng tôi có thể trợ giúp nếu bạn cung cấp một số chi tiết về điều khiển bạn đang sử dụng và bất kỳ mã nào bạn đã viết để cập nhật/điền vào nó. –
@CameronPeters, bạn có chắc chắn không thể có nhiều hơn một “chuỗi giao diện người dùng”? – svick
Hiện tại, tôi có nhiều luồng 'UI' đang chạy (nhờ Threading.Dispatcher.Run()), nhưng không thể chặn chúng chờ tín hiệu. – DefenestrationDay