Утечка памяти в .Net Speech.Synthesizer?

Я обнаружил постоянную утечку в своем приложении. Изучив с помощью профилировщика памяти, я обнаружил, что курс представляет собой какой-то объект из 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

но, к сожалению, я не нашел решения этой проблемы. Так как проблема уже давно задана, поэтому я хочу спросить, решена она или нет?

Большое спасибо.

ОБНОВЛЕНИЕ:

Кажется, когда я переключаюсь на использование SAPI COM dll, а не пакета .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 КБ

8
задан Community 23 May 2017 в 12:09
поделиться