Có một vài tùy chọn bạn có thể thực hiện ở đây. Đầu tiên, bạn có thể thiết lập bộ đệm đôi trên biểu mẫu, điều này sẽ kết thúc vẽ tất cả các bản cập nhật trên một bitmap cơ bản, sau đó hiển thị hình ảnh mới được vẽ (thay vì vẽ các Điều khiển riêng lẻ trên một đối tượng đồ họa). Tôi thấy tốc độ tăng 50% với phương pháp này. Đưa nội dung này vào hàm tạo:
this.SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer,true);
Điều khác cần lưu ý là ghép nối chuỗi là SLOW cho một lượng lớn dữ liệu. Bạn nên sử dụng một StringBuilder để xây dựng dữ liệu và sau đó chỉ hiển thị nó bằng cách sử dụng StringBuilder.ToString (mặc dù vẫn còn tốt hơn để tách rời các bản cập nhật, có thể một lần mỗi 100 lần lặp lại). Trên máy tính của tôi, chỉ cần thay đổi nó để nối thêm vào StringBuilder, nó đã đi từ 2,5 phút để chạy qua 10k lần lặp đến khoảng 1,5 phút. Tốt hơn, nhưng vẫn chậm.
new System.Threading.Thread(() =>
{
for(int i = 0; i < 10000; i++)
{
sb.AppendLine(DateTime.Now.ToString());
Invoke((Action)(() =>
{
txtArea.Text = sb.ToString();
txtArea.SelectionStart = txtArea.Text.Length;
txtArea.ScrollToCaret();
}));
}
}).Start();
Cuối cùng, chỉ cần thử nghiệm đáng kinh ngạc (ném một điều kiện duy nhất vào mã trên, ngay trước cuộc gọi Gọi) và kết thúc sau 2 giây. Vì chúng tôi đang sử dụng StringBuilder để thực sự xây dựng chuỗi, chúng tôi vẫn giữ lại tất cả dữ liệu, nhưng bây giờ chúng tôi chỉ phải thực hiện cập nhật 100 lần so với 10k lần.
Vì vậy, bây giờ, các tùy chọn của bạn là gì? Cho rằng đây là một ứng dụng WinForm, bạn có thể sử dụng một trong nhiều đối tượng Timer để thực sự cập nhật giao diện người dùng cho điều khiển cụ thể đó hoặc bạn có thể chỉ cần đếm số lượng "lần đọc" hoặc "cập nhật" cho dữ liệu cơ bản (trong trường hợp của bạn, một luồng) và chỉ cập nhật giao diện người dùng trên số lần thay đổi X. Bằng cách sử dụng cả hai tùy chọn StringBuilder và cập nhật so le có lẽ là con đường để đi.
Bạn có thể đọc nhanh không? Tôi không. Chỉ cần cập nhật các hộp văn bản mỗi x giây thay vì mỗi đánh dấu đồng hồ. –
Đây chỉ là một ví dụ về cách tái sản xuất vấn đề (mặc dù hơi khắc nghiệt). Tôi thực sự đang đọc từ một luồng, vì vậy các bản cập nhật có thể nhanh hoặc chậm. – qJake
Vẫn còn câu hỏi và đề xuất của tôi vẫn giữ nguyên. Giao diện người dùng là để phù hợp với người dùng. –