Petite Question
J'ai une boucle qui s'exécute 180 000 fois. À la fin de chaque itération, il est censé ajouter les résultats d'une zone de texte, qui est mis à jour en temps réel.
À l'aide de MyTextBox.Text += someValue
est à l'origine de la demande de manger d'énormes quantités de mémoire, et il est à court de mémoire disponible après quelques milliers d'enregistrements.
Est-il un moyen plus efficace de l'ajout de texte à un TextBox.Text
180 000 fois?
Edit j'ai vraiment ne se soucient pas le résultat de ce cas particulier, cependant, je veux savoir pourquoi ce qui semble être un dévoreur de mémoire, et si il ya un moyen plus efficace pour ajouter du texte à une zone de texte
Long (D'Origine) Question
J'ai une petite application qui lit une liste de numéros d'ID dans un fichier CSV et génère un rapport au format PDF pour chacun. Après chaque fichier pdf est généré, l' ResultsTextBox.Text
est ajoutée avec le Numéro d'identification du rapport qui les a transformés et qu'il a été traité avec succès. Le processus s'exécute sur un thread d'arrière-plan, de sorte que le ResultsTextBox est mis à jour en temps réel, les éléments traités
Je suis actuellement en cours d'exécution de l'application à l'encontre de 180 000 numéros d'identification, cependant la mémoire de l'application est de prendre croît de façon exponentielle à mesure que le temps passe. Il commence par environ 90K, mais par environ 3000 dossiers c'est de prendre environ 250 MO et par 4000 enregistrements de l'application est de prendre environ 500 MO de mémoire.
Si je commenter la mise à jour des Résultats de la zone de texte, la mémoire reste relativement stationnaire à environ 90K, donc je peux supposer que la rédaction ResultsText.Text += someValue
est ce qui est à l'origine de consommer de la mémoire.
Ma question est, pourquoi est-ce? Quelle est la meilleure façon d'ajout de données à une zone de texte.Texte qui ne mange pas de mémoire?
Mon code ressemble à ceci:
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 });
}
Il convient également de mentionner que l'application est une chose une seule fois et il n'a pas d'importance que va prendre quelques heures (ou jours :)) pour générer tous les rapports. Ma principale préoccupation est que si elle frappe le système de limite de mémoire, il s'arrête en cours d'exécution.
Je suis très bien avec la sortie de la ligne de mise à jour des Résultats de zone de texte commenté pour exécuter cette chose, mais je voudrais savoir si il y a une mémoire plus efficace d'ajouter des données à un TextBox.Text
pour les projets futurs.