Tôi nghĩ rằng tôi cần một số giải thích về WPFs Dispatcher.Invoke và Dispatcher.BeginInvoke cách sử dụng.WPF Dispatcher.BeginInvoke và UI/Chủ đề nền
Giả sử tôi có một số dài chạy 'công việc' mã như thế này mà được gọi trên báo chí của một nút trong một ứng dụng WPF đơn giản:
longWorkTextBox.Text = "Ready For Work!";
Action workAction = delegate
{
Console.WriteLine("Starting Work Action");
int i = int.MaxValue;
while (i > 0)
i--;
Console.WriteLine("Ending Work Action");
longWorkTextBox.Text = "Work Complete";
};
longWorkTextBox.Dispatcher.BeginInvoke(DispatcherPriority.Background, workAction);
Mã này được khóa lên giao diện người dùng của tôi trong khi workAction đang được thực hiện. Điều này là do Dispatcher gọi luôn luôn chạy trên thread UI, phải không?
Giả sử điều này, thực tiễn tốt nhất để định cấu hình điều phối viên của tôi là thực thi hành động làm việc trong một chuỗi riêng biệt từ giao diện người dùng của tôi là gì? Tôi biết tôi có thể thêm một BackgroundWorker-workAction tôi để ngăn chặn UI của tôi từ khóa như vậy:
longWorkTextBox.Text = "Ready For Work!";
Action workAction = delegate
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate
{
Console.WriteLine("Starting Slow Work");
int i = int.MaxValue;
while (i > 0)
i--;
Console.WriteLine("Ending Work Action");
};
worker.RunWorkerCompleted += delegate
{
longWorkTextBox.Text = "Work Complete";
};
worker.RunWorkerAsync();
};
longWorkTextBox.Dispatcher.BeginInvoke(DispatcherPriority.Background, workAction);
Có cách nào tao nhã hơn để làm điều này bên cạnh việc sử dụng BackgroundWorker? Tôi đã luôn luôn nghe rằng BackgroundWorker là kỳ quặc, vì vậy tôi tò mò muốn biết một số lựa chọn thay thế.
Đúng. Bạn muốn làm một cái gì đó trong một chủ đề nền, nhưng ảnh hưởng đến các chủ đề giao diện người dùng khi bạn đã hoàn tất, BackgroundWorker là khá nhiều điều dễ nhất để sử dụng. –
Trong năm 2013, có một cách đơn giản hơn - không đồng bộ/chờ đợi: http://stackoverflow.com/questions/12654968/is-async-and-await-exclusively-for-gui-based-asynchronous-programming – Cosmin
Tôi thực sự thích không đồng bộ, nhưng nó không hoạt động tốt với mọi thứ. Nhưng nó là một lựa chọn khá tốt! – Malavos