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
¿Puedes publicar alguno de esos enlaces? ¿Hay un problema de MS Connect para esto? – codekaizen
@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