Tôi đã tạo một Ứng dụng WPF đơn giản và thêm một nút vào cửa sổ mặc định. Khi tôi nhấp vào nút, một phương pháp làm việc dài mô phỏng (được mô phỏng bằng cách sử dụng Thread.Sleep (15000) được gọi .Tôi đang cố gắng làm cho nút thực thi không đồng bộ, mặc dù sau các ví dụ trực tuyến, nút và toàn bộ cửa sổ khóa ngay khi tôi bấm và vẫn như vậy cho đến khi Thread.Sleep (...) kết thúcUI Thread Block
Bất cứ ý tưởng tại sao điều này đang xảy ra
đây là mã:.?
private void button1_Click(object sender, RoutedEventArgs e)
{
DoSomeAsyncWork();
}
private void DoSomeAsyncWork()
{
System.Windows.Threading.Dispatcher.Run();
Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart(
delegate()
{
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => Thread.Sleep(15000)));
}
));
thread.Start();
}
Tôi thực sự đang cố gắng thực thi một số mã yêu cầu chuỗi riêng và khi tôi đặt dòng mã này trực tiếp trong đại biểu đầu tiên (tức là bạn có Thread.Sleep (15000)) I nhận được thông báo cho biết rằng chuỗi không thể truy cập các đối tượng. Đây là thông báo: "Chuỗi cuộc gọi không thể truy cập đối tượng này bởi vì một chuỗi khác sở hữu nó." Rõ ràng, đó là một vấn đề phổ biến nhưng làm thế nào tôi đang đấu tranh để có được xung quanh này mà không đi xuống con đường của việc sử dụng một nhân viên nền. Vì vậy, khi tôi thêm vào lồng nhau BeginInvoke thứ hai gọi đối tượng được tìm thấy nhưng giao diện người dùng bị chặn. – fin
Vì vậy, tôi đoán, những gì tôi đang tìm kiếm là một phương pháp để đặt logic của tôi dường như yêu cầu truy cập vào chuỗi giao diện người dùng trên một chuỗi nền mới. Để tóm tắt, cấp quyền truy cập cho các đối tượng UI nhưng chạy trên một chuỗi riêng biệt trong nền? – fin
@Finbar: Bạn không thể "cấp quyền truy cập". Hoạt động UI * phải * được thực hiện trong chuỗi giao diện người dùng. Tuy nhiên, những gì bạn có thể làm là chia các hoạt động giao diện người dùng thành các bit nhỏ, đặt vòng lặp lớn trong chuỗi nền và gọi 'Dispatcher.BeginInvoke (... hoạt động giao diện người dùng ngắn ...)' bên trong vòng lặp. Điều này làm cho giao diện người dùng bị chặn ngay nhiều lần thay vì một lần trong một thời gian dài. – Heinzi