Câu hỏi ngắn
Tôi có một vòng lặp chạy 180.000 lần. Vào cuối mỗi lần lặp, nó phải nối kết quả vào một TextBox, được cập nhật theo thời gian thực.
Việc sử dụng MyTextBox.Text += someValue
khiến ứng dụng ngốn bộ nhớ rất lớn và hết bộ nhớ khả dụng sau vài nghìn bản ghi.
Có cách nào hiệu quả hơn để nối văn bản với TextBox.Text
180.000 lần không?
Chỉnh sửa Tôi thực sự không quan tâm đến kết quả của trường hợp cụ thể này, tuy nhiên tôi muốn biết tại sao đây dường như là một ổ nhớ và liệu có cách nào hiệu quả hơn để nối văn bản vào TextBox.
Câu hỏi dài (Bản gốc)
Tôi có một ứng dụng nhỏ đọc danh sách các số ID trong tệp CSV và tạo báo cáo PDF cho từng số. Sau khi mỗi tệp pdf được tạo, tệp ResultsTextBox.Text
sẽ được nối với Số ID của báo cáo đã được xử lý và nó đã được xử lý thành công. Quá trình chạy trên một chuỗi nền, do đó, ResultsTextBox được cập nhật theo thời gian thực khi các mục được xử lý
Tôi hiện đang chạy ứng dụng với 180.000 số ID, tuy nhiên, bộ nhớ mà ứng dụng đang chiếm dụng đang tăng lên theo cấp số nhân khi thời gian trôi qua. Nó bắt đầu với khoảng 90K, nhưng với khoảng 3000 bản ghi, nó chiếm khoảng 250MB và đến 4000 bản ghi, ứng dụng sẽ chiếm khoảng 500 MB bộ nhớ.
Nếu tôi nhận xét về bản cập nhật cho Hộp văn bản kết quả, bộ nhớ vẫn tương đối cố định ở khoảng 90K, vì vậy tôi có thể giả định rằng việc viết ResultsText.Text += someValue
là nguyên nhân khiến nó ăn bộ nhớ.
Câu hỏi của tôi là, tại sao lại như vậy? Cách tốt hơn để nối dữ liệu vào TextBox.Text không ăn bộ nhớ là gì?
Mã của tôi trông như thế này:
try
{
report.SetParameterValue("Id", id);
report.ExportToDisk(ExportFormatType.PortableDocFormat,
string.Format(@"{0}\{1}.pdf", new object[] { outputLocation, id}));
// ResultsText.Text += string.Format("Exported {0}\r\n", id);
}
catch (Exception ex)
{
ErrorsText.Text += string.Format("Failed to export {0}: {1}\r\n",
new object[] { id, ex.Message });
}
Cũng cần phải nhắc lại rằng ứng dụng là một thứ sử dụng một lần và sẽ không quan trọng rằng sẽ mất vài giờ (hoặc vài ngày :)) để tạo tất cả các báo cáo. Mối quan tâm chính của tôi là nếu nó đạt đến giới hạn bộ nhớ hệ thống, nó sẽ ngừng chạy.
Tôi ổn với việc để dòng cập nhật Kết quả TextBox đã nhận xét để chạy điều này, nhưng tôi muốn biết liệu có cách nào hiệu quả hơn về bộ nhớ để gắn dữ liệu vào a TextBox.Text
cho các dự án trong tương lai hay không.
StringBuilder
để nối văn bản, sau đó, sau khi hoàn thành, hãy gánStringBuilder
giá trị cho hộp văn bản.