2012-05-22 14 views
7

Encontré una fuga continua en mi aplicación. Después de examinar el uso de un generador de perfiles de memoria, he encontrado el curso es un objeto de Microsoft Speech.SynthesizerFuga de memoria en .Net Speech.Synthesizer?

Así que construir un proyecto de juguete para verificar la hipótesis:

ejemplo

// juguete para mostrar pérdida de memoria en el habla. sintetizador objeto

static void Main(string[] args) 
{ 
    string text = "hello world. This is a long sentence"; 
    PromptBuilder pb = new PromptBuilder(); 
    pb.StartStyle(new PromptStyle(PromptRate.ExtraFast)); 
    pb.AppendText(text); 
    pb.EndStyle(); 
    SpeechSynthesizer tts = new SpeechSynthesizer(); 

while (true) 
{ 
    //SpeechSynthesizer tts = new SpeechSynthesizer(); 
    Console.WriteLine("Speaking..."); 
    tts.Speak(pb); 

    //Print private working set sieze 
    Console.WriteLine("Memory: {0} KB\n", (Process.GetCurrentProcess().PrivateMemorySize64/1024).ToString("0")); 

    //tts.Dispose(); //also this doesn't work as well 
    //tts = null; 

    GC.Collect(); //a little help, but still leaks 
} 
} 

Y el resultado de hecho confirmaron la pérdida de memoria es de Speech.Synthesizer

Speaking... 

memoria: 42184 KB

Hablando ... Memoria: 42312 KB

Hablando ... Memoria: 42440 KB

Hablando ... Memoria: 42568 KB

Hablando ... memoria: 42696 KB

Hablando ... memoria: 42824 KB

Hablando ... Memoria: 43016 KB

Hablando ... Memoria: 43372 KB

busqué en Google y encontré muchos otros han encontrado el mismo problema: 1: Constant Memory Leak in SpeechSynthesizer 2: http://connect.microsoft.com/VisualStudio/feedback/details/664196/system-speech-has-a-memory-leak

pero lamentablemente no encontré ninguna solución para ello. Dado que es un problema ya planteado hace mucho tiempo, entonces quiero preguntar si se ha resuelto o no.

Muchas gracias.

ACTUALIZACIÓN:

parece que mientras me cambio a utilizar SAPI COM DLL en lugar de paquete .Net Speech.Synthesizer (aunque en esencia son la misma cosa), la memoria deja de fugas.

¿Por qué los dos comportamientos de invocación (SAPI dll vs .net Speech package) tienen un comportamiento de memoria diferente? Como lo último parece, es solo un envoltorio para el anterior dll de SAPI.

static void Test2() 
{ 
    //SAPI COM component this time 
    SpeechLib.SpVoiceClass tts = new SpeechLib.SpVoiceClass(); 
    tts.SetRate(5); 
    string text = "hello world. This is a long sentence"; 
    //tts.Speak("helloWorld", SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault); 
while (true) 
{ 

    Console.WriteLine("Speaking..."); 
    tts.Speak(text, SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault); 

    //Print private working set sieze 
    Console.WriteLine("Memory: {0} KB\n", (Process.GetCurrentProcess().PrivateMemorySize64/1024).ToString("0")); 

    GC.Collect(); 
} 

}

Memoria: 32044 KB

Hablando ... Memoria: 32044 KB

Hablando ... Memoria: 32044 KB

Hablando. .. Memoria: 32044 KB

Hablando ... Memoria: 32044 KB

Hablando ... Memoria: 32044 KB

Hablando ... Memoria: 32044 KB

Hablando. .. Memoria: 32044 KB

Respuesta

3

solución final:

-ing Google las palabras clave relevantes que me dice que en realidad es un error de Microsoft.

Parece que cuando cambio a utilizar SAPI COM dll en lugar de .Net Speech.Synthesizer (aunque esencialmente son lo mismo), la memoria deja de tener fugas.

+0

¿Puedes publicar alguno de esos enlaces? ¿Hay un problema de MS Connect para esto? – codekaizen

+0

@codekaizen Sí, en realidad leí algunos usuarios informan en el foro de MS, la publicación se publicó hace dos años. Es por eso que llego a tal conclusión. Tendré que volver a buscar la publicación que leí el mes pasado ... – JXITC

3

No estoy seguro de todos los detalles en el SpeechSynthesizer, pero podría intentar usar el patrón desechable aquí. Desde SpeechSynthesizer implementa IDisposable

Su código se vería como la siguiente:

while (true) 
{ 
    using (SpeechSynthesizer tts = new SpeechSynthesizer()) 
    { 
     Console.WriteLine("Speaking..."); 
     tts.Speak(pb); 

     //Print private working set sieze 
     Console.WriteLine("Memory: {0} KB\n",(Process.GetCurrentProcess().PrivateMemorySize64/1024).ToString("0")); 
    } 
} 

Si se observa esto es muy similar a la del ejemplo de Microsoft Here

Esto se ve en el hecho de ser una pérdida de memoria, usted tiene intentado usar el Microsoft.Speech runtime? La sintaxis se ve muy similar y lo han mencionado no debería tienen el mismo problema.

+1

Gracias :) pero todavía tiene las pérdidas de memoria – JXITC

+0

Parece que en base a la propia admisión de Microsoft esto se filtra. Ver Editar arriba. –

+0

¿Por qué los dos comportamientos de invocación (SAPI dll vs .net Speech package) tienen un comportamiento de memoria diferente? Como lo último parece, es solo un envoltorio para el anterior dll de SAPI. – JXITC