Veräußern eines StringBuilder-Objekts

Wie entsorgt man ein StringBuilder object? If an user generates multiple reports in a single sitting, my app ends up using a huge amount of memory. Objekt effektiv? Wenn ein Benutzer mehrere Berichte in einer Sitzung generiert, verwendet meine App am Ende eine riesige Menge an Arbeitsspeicher.

Ich habe in ein paar Websites online gelesen, dass der Folgende helfen kann:

StringBuilder sb = new StringBuilder(1000000);

// loop goes here adding lots of stuff to sb

exampleObject.Text = sb.ToString();

sb.Length = 0;

Hilft die letzte Zeile wirklich? Auf andere Weise, um damit umzugehen?

NB: Das hält meine Benutzer nicht wirklich davon ab, die Anwendung weiterhin zu verwenden. Ich frage mich nur, ob es eine Möglichkeit gibt, redundante Speichernutzung zu vermeiden.

Antwort auf "Veräußern eines StringBuilder-Objekts " 3 von antworten

Nein, ein StringBuilder is a purely managed resource. You should just get rid of all references to it. Everything else is taken care of by the garbage collector: ist eine rein verwaltete Ressource. Sie sollten einfach alle Verweise darauf loswerden. Alles andere kümmert sich der Garbage Collector:

StringBuilder sb = ...;
// ... do work
sb = null; // or simply let it go out of scope.

In .NET gibt es keine deterministische delete (like C++, where you free up memory allocated to a single object.) Only GC can free memory. By forfeiting all references to an object, you'll let GC be able to deallocate the object if it wants to. You can force a garbage collection by calling the (wie C++, wo Sie Speicher freigibt, der einem einzelnen Objekt zugewiesen ist.) Nur GC kann Speicher freimachen. Wenn Sie alle Verweise auf ein Objekt verlieren, können Sie GC die Zuordnung des Objekts aufteilen, wenn es möchte. Sie können eine Garbage Collection erzwingen, indem Sie die System.GC.Collect method. However, it's not recommended to manipulate with GC unless you really know what you are doing. GC is smart. It's rarely beneficial to force it.-Methode aufrufen. Es wird jedoch nicht empfohlen, mit GC zu manipulieren, es sei denn, Sie wissen wirklich, was Sie tun. GC ist intelligent. Es ist selten vorteilhaft, es zu erzwingen.

Es sei denn, die "übermäßige Speichernutzung" ist ein Problem, ich würde es so lassen, wie es ist und mich keine Sorgen machen.

.NET ist in den meisten Fällen intelligent genug, um eine Garbage Collection zu vermeiden, wenn genügend Arbeitsspeicher verfügbar ist.

Wenn Sie viele Berichte generieren, können Sie die Verwendung eines einzelnen StringBuilder in Betracht ziehen, anstatt für jeden Bericht einen neuen Zuteilungsbericht zuzuweisen.