Câu hỏi ngắnTại sao phụ thêm vào TextBox.Text trong vòng lặp mất nhiều bộ nhớ hơn với mỗi lần lặp?
Tôi có vòng lặp chạy 180.000 lần. Vào cuối mỗi lần lặp lại, nó được cho là gắn kết quả vào một TextBox, được cập nhật theo thời gian thực.
Sử dụng MyTextBox.Text += someValue
đang khiến ứng dụng ăn một lượng bộ nhớ khổng lồ và hết bộ nhớ sau một vài nghìn bản ghi.
Có cách nào hiệu quả hơn để nối văn bản vào 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 lý do tại sao điều này dường như là bộ nhớ và nếu có cách hiệu quả hơn để nối văn bản vào TextBox.
Long (Original) Câu hỏi
Tôi có một ứng dụng nhỏ mà đọc một danh sách các số ID trong một tập tin CSV và tạo ra một báo cáo PDF cho mỗi một. Sau khi mỗi tệp pdf được tạo, ResultsTextBox.Text
đượ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ớ ứng dụng đang tăng lên theo cấp số nhân theo thời gian đi bằng. Nó bắt đầu khoảng 90K, nhưng khoảng 3000 hồ sơ nó chiếm khoảng 250MB và 4000 hồ sơ ứng dụng chiếm khoảng 500 MB bộ nhớ.
Nếu tôi nhận xét 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ết ResultsText.Text += someValue
là những gì gây ra nó để ăn bộ nhớ.
Câu hỏi của tôi là, tại sao điều này? Cách tốt nhất để thêm 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 nên đáng nói đến là ứng dụng là một điều một lần và nó không quan trọng mà nó sẽ mất 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 Hộp văn bản kết quả 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 để bổ sung dữ liệu vào TextBox.Text
cho các dự án trong tương lai hay không.
Bạn có thể thử sử dụng 'StringBuilder' để chắp thêm văn bản, sau khi hoàn thành, gán giá trị' StringBuilder' vào hộp văn bản. – keyboardP
@keyboardP Tôi quên đề cập đến vòng lặp chạy trên chuỗi nền và Hộp văn bản kết quả được cập nhật theo thời gian thực – Rachel
Tôi không biết liệu nó có thay đổi được gì hay không nhưng nếu bạn có một StringBuilder gắn thêm Id mới và bạn sẽ sử dụng một thuộc tính được cập nhật với giá trị mới của trình tạo chuỗi và Liên kết điều này với thuộc tính textbox.text của bạn. – BigL