Tôi đang cố gắng sử dụng một nhân viên nền để lấy một lượng lớn dữ liệu từ cơ sở dữ liệu mà không bị trì hoãn chủ đề chính. Điều này có vẻ hoạt động tốt, ngoại trừ khi cập nhật giao diện người dùng, bản cập nhật sẽ đóng băng màn hình. Mã có liên quan như sau:C# Cập nhật giao diện người dùng nền công nhân
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lvwTest.BeginUpdate();
lvwTest.Items.Clear();
// Populate the UI
foreach (TestItem ti in testData)
{
ListViewItem lvi = lvwTest.Items.Add(ti.Value1);
lvi.SubItems.Add(ti.Value2);
}
lvwTest.EndUpdate();
}
Bản cập nhật mất khoảng 2 - 3 giây, khi màn hình bị khóa. Tôi nhận ra rằng chỉ có chủ đề chính mới có thể cập nhật màn hình, nhưng có thể tải dữ liệu này vào bộ nhớ theo một cách nào đó (trong một chuỗi nền hoặc một ví dụ khác của một listview hoặc một cái gì đó) và sau đó chỉ cần hiển thị nó? Tất cả những gì tôi muốn xảy ra là chương trình chỉ cần làm mới dữ liệu mà không cần tốn thời gian trong chuỗi chính.
Nó là một ứng dụng WinForm - nhưng trở lại trong những ngày VB6, DoEvents được tán thành bởi vì nó có thể thay đổi chuỗi sự kiện. Đó không phải là trường hợp trong C#? –
Bạn có thể đúng, nó vẫn là một chút của một hack từ những gì tôi đã nghe. Phụ thuộc vào sự phức tạp của ứng dụng của bạn. Tôi đã viết lại ứng dụng đơn giản cuối cùng của mình cho WPF, đó thực sự là một Framework thực sự tốt đẹp. – Remy