Постоянная утечка памяти в SpeechSynthesizer
Я разработал проект, который я хотел бы выпустить, который использует c #, WPF и объект System.Speech.Synthesizer. Проблема, препятствующая выпуску этого проекта, заключается в том, что всякий раз, когда вызывается SpeakAsync, он оставляет утечку памяти, которая возрастает до возможного сбоя. Я полагаю, что я правильно вымылся после использования этого объекта, но не могу найти лекарство. Я запустил программу через Ants Memory Profiler, и она сообщает, что WAVEHDR и WaveHeader растут с каждым вызовом.
Я создал пример проекта, чтобы попытаться определить причину, но все еще в растерянности. Любая помощь будет оценена.
Проект использует VS2008 и представляет собой проект c # WPF, предназначенный для .NET 3.5 и любого процессора. Вам необходимо вручную добавить ссылку на System.Speech.
Вот код:
<Window x:Class="SpeechTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<StackPanel Orientation="Vertical">
<Button Content="Start Speaking" Click="Start_Click" Margin="10" />
<Button Content="Stop Speaking" Click="Stop_Click" Margin="10" />
<Button Content="Exit" Click="Exit_Click" Margin="10"/>
</StackPanel>
</Grid>
// Start of code behind
using System;
using System.Windows;
using System.Speech.Synthesis;
namespace SpeechTest
{
public partial class Window1 : Window
{
// speak setting
private bool speakingOn = false;
private int curLine = 0;
private string [] speakLines = {
"I am wondering",
"Why whenever Speech is called",
"A memory leak occurs",
"If you run this long enough",
"It will eventually crash",
"Any help would be appreciated" };
public Window1()
{
InitializeComponent();
}
private void Start_Click(object sender, RoutedEventArgs e)
{
speakingOn = true;
SpeakLine();
}
private void Stop_Click(object sender, RoutedEventArgs e)
{
speakingOn = false;
}
private void Exit_Click(object sender, RoutedEventArgs e)
{
App.Current.Shutdown();
}
private void SpeakLine()
{
if (speakingOn)
{
// Create our speak object
SpeechSynthesizer spk = new SpeechSynthesizer();
spk.SpeakCompleted += new EventHandler(spk_Completed);
// Speak the line
spk.SpeakAsync(speakLines[curLine]);
}
}
public void spk_Completed(object sender, SpeakCompletedEventArgs e)
{
if (sender is SpeechSynthesizer)
{
// get access to our Speech object
SpeechSynthesizer spk = (SpeechSynthesizer)sender;
// Clean up after speaking (thinking the event handler is causing the memory leak)
spk.SpeakCompleted -= new EventHandler(spk_Completed);
// Dispose the speech object
spk.Dispose();
// bump it
curLine++;
// check validity
if (curLine >= speakLines.Length)
{
// back to the beginning
curLine = 0;
}
// Speak line
SpeakLine();
}
}
}
}
Я запускаю эту программу на Windows 7 64-битной, и она будет запускаться и в конечном итоге останавливаться при попытке создать новый объект SpeechSynthesizer. При запуске в 64-разрядной версии Windows Vista объем памяти увеличивается с 34 тыс. До 400 тыс. И увеличивается.
Может ли кто-нибудь увидеть в коде что-то, что может быть причиной этого, или это проблема самого объекта Speech.
Любая помощь будет оценена.