2009-08-25 11 views
16

Come si dispiega effettivamente un oggetto StringBuilder? Se un utente genera più rapporti in una singola seduta, la mia app finisce per utilizzare un'enorme quantità di memoria.Smaltimento di un oggetto StringBuilder

ho letto in alcuni siti on-line che il follow può aiutare:

StringBuilder sb = new StringBuilder(1000000); 

// loop goes here adding lots of stuff to sb 

exampleObject.Text = sb.ToString(); 

sb.Length = 0; 

Vuol l'ultima riga davvero aiutare? Qualunque altro modo di affrontare questo?

NB: Questo in realtà non impedisce ai miei utenti di continuare a utilizzare l'applicazione. Mi sto solo chiedendo se esiste un modo per evitare l'uso ridondante della memoria.

+2

togliere il 1000000 potrebbe aiutare – David

+3

Come? La memoria di pre-allocazione ha aiutato molto. Lasciare StringBuilder costantemente ridimensionato stava rallentando un po 'le cose. – Druid

risposta

33

No, a StringBuilder è una risorsa gestita esclusivamente. Dovresti solo sbarazzarti di tutti i riferimenti ad esso. Tutto il resto è curato dal garbage collector:

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

In .NET, non c'è deterministico delete (come C++, dove liberare memoria allocata per un singolo oggetto.) Solo GC possibile liberare la memoria. Rinunciando a tutti i riferimenti a un oggetto, lascerai che GC sia in grado di deallocare l'oggetto se lo desidera. È possibile forzare una garbage collection chiamando il metodo System.GC.Collect. Tuttavia, non è consigliabile manipolare con GC a meno che tu non sappia veramente cosa stai facendo. GC è intelligente. Raramente è utile forzarlo.

+1

aggiungendo un GC.Collect() è perfettamente valido se l'utilizzo della memoria all'interno dell'app è eccessivo al punto da causare problemi di esaurimento della memoria. .Net garbage collection lo ripulirà automaticamente quando si tenta di allocare memoria aggiuntiva e l'o/s è affamato, o durante il suo ciclo successivo. Di solito non ne hai bisogno a meno che la tua app non sia molto guidata dalle prestazioni. –

1

A meno che l''uso eccessivo della memoria' sia un problema, lo lascerei così com'è e non mi preoccuperei.

.NET è nella maggior parte dei casi abbastanza intelligente da evitare di eseguire una garbage collection se si dispone di memoria sufficiente.

2

Se si generano molti report, è possibile considerare di riutilizzare un singolo StringBuilder invece di assegnarne uno nuovo per ogni report.

Problemi correlati