Я обнаружил постоянную утечку в своем приложении. Изучив с помощью профилировщика памяти, я обнаружил, что в ход идет какой-то объект от Microsoft Speech.Synthesizer.
Поэтому я создаю игрушечный проект для проверки гипотезы:
//Игрушечный пример, показывающий утечку памяти в объекте Speech.Synthesizer
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
}
}
И результат фактически подтвердил утечку памяти из Speech.Synthesizer.
Speaking...
Память: 42184 КБ
Говоря... Память: 42312 КБ
Говоря... Память: 42440 КБ
Говоря... Память: 42568 КБ
Говоря... Память: 42696 КБ
Говоря... Память: 42824 КБ
Говоря... Память: 43016 КБ
Говоря... Память: 43372 КБ
Я погуглил и обнаружил, что многие другие сталкивались с той же проблемой: 1: Постоянная утечка памяти в SpeechSynthesizer 2: http://connect.microsoft.com/VisualStudio/feedback/details/664196/system-speech-has-a-memory-leak
но, к сожалению, я не нашел никакого решения для этого. Поскольку проблема уже задана давно, поэтому я хочу спросить, решена она или нет?
Огромное спасибо.
ОБНОВЛЕНИЕ:
Похоже, пока я переключаюсь на использование dll SAPI COM, а не пакета .Net Speech.Synthesizer (хотя по сути это одно и то же), память перестает течь.
Почему поведение двух вызовов (библиотека SAPI dll и пакет .net Speech) имеет разное поведение памяти? Поскольку последний кажется просто оболочкой для прежней dll 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();
}
}
Память: 32044 КБ
Говоря... Память: 32044 КБ
Говоря... Память: 32044 КБ
Говоря... Память: 32044 КБ
Говоря... Память: 32044 КБ
Говоря... Память: 32044 КБ
Говоря... Память: 32044 КБ
Говоря... Память: 32044 КБ