Krótkie pytanie
Mam pętlę, która działa 180 000 razy. Pod koniec każdej iteracji ma dołączyć wyniki do TextBox, które jest aktualizowane w czasie rzeczywistym.
Używanie MyTextBox.Text += someValue
powoduje, że aplikacja zjada ogromne ilości pamięci i po kilku tysiącach rekordów wyczerpuje się dostępna pamięć.
Czy istnieje skuteczniejszy sposób dołączania tekstu do TextBox.Text
180 000 razy?
Edytuj Naprawdę nie obchodzi mnie wynik tego konkretnego przypadku, jednak chcę wiedzieć, dlaczego wydaje się to być świnią pamięci i czy istnieje bardziej wydajny sposób dołączania tekstu do TextBox.
Długie (oryginalne) pytanie
Mam małą aplikację, która odczytuje listę numerów identyfikacyjnych w pliku CSV i generuje raport PDF dla każdego z nich. Po wygenerowaniu każdego pliku PDF ResultsTextBox.Text
do raportu dołączany jest numer identyfikacyjny raportu, który został przetworzony i został pomyślnie przetworzony. Proces działa w wątku w tle, więc ResultsTextBox jest aktualizowany w czasie rzeczywistym, gdy elementy są przetwarzane
Obecnie używam aplikacji dla 180 000 numerów identyfikacyjnych, jednak pamięć, którą aplikacja zajmuje, rośnie wykładniczo w miarę upływu czasu. Zaczyna się od około 90 KB, ale przy około 3000 rekordach zajmuje około 250 MB, a przy 4000 rekordów aplikacja zajmuje około 500 MB pamięci.
Jeśli skomentuję aktualizację w polu tekstowym wyników, pamięć pozostaje względnie stacjonarna przy około 90K, więc mogę założyć, że pisanie ResultsText.Text += someValue
powoduje zjadanie pamięci.
Moje pytanie brzmi: dlaczego tak się dzieje? Jaki jest lepszy sposób dołączania danych do TextBox.Text, który nie zużywa pamięci?
Mój kod wygląda tak:
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 });
}
Warto też wspomnieć, że aplikacja jest jednorazowa i nie ma znaczenia, że wygenerowanie wszystkich raportów zajmie kilka godzin (lub dni :)). Moim głównym zmartwieniem jest to, że jeśli osiągnie limit pamięci systemowej, przestanie działać.
Nie przeszkadza mi pozostawienie wiersza aktualizującego pole tekstowe wyników, które zostało zakomentowane, aby uruchomić tę funkcję, ale chciałbym wiedzieć, czy istnieje bardziej wydajny sposób dołączania danych do pliku TextBox.Text
dla przyszłych projektów.
StringBuilder
aby dołączyć tekst, a następnie, po zakończeniu, przypiszStringBuilder
wartość do pola tekstowego.