Konstanter Speicherverlust in SpeechSynthesizer
Ich habe ein Projekt entwickelt, das ich veröffentlichen möchte und das C #, WPF und das System.Speech.Synthesizer-Objekt verwendet. Das Problem, das die Veröffentlichung dieses Projekts verhindert, besteht darin, dass bei jedem Aufruf von SpeakAsync ein Speicherverlust auftritt, der bis zum endgültigen Ausfall ansteigt. Ich glaube, dass ich nach der Verwendung dieses Objekts richtig aufgeräumt habe, aber keine Heilung finden kann. Ich habe das Programm über Ants Memory Profiler ausgeführt und es meldet, dass WAVEHDR und WaveHeader mit jedem Aufruf größer werden.
Ich habe ein Beispielprojekt erstellt, um die Ursache zu ermitteln, bin aber immer noch ratlos. Jede Hilfe wäre dankbar.
Das Projekt verwendet VS2008 und ist ein c # WPF-Projekt, das auf .NET 3.5 und eine beliebige CPU abzielt. Sie müssen manuell einen Verweis auf System.Speech hinzufügen.
Hier ist der Code:
<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();
}
}
}
}
Ich führe dieses Programm unter Windows 7 64-Bit aus und es wird ausgeführt und möglicherweise angehalten, wenn versucht wird, ein neues SpeechSynthesizer-Objekt zu erstellen. Unter Windows Vista 64-Bit wächst der Speicher von 34.000 auf 400.000.
Kann jemand irgendetwas im Code sehen, das dies verursacht, oder ist dies ein Problem mit dem Speech-Objekt selbst?
Jede Hilfe wäre dankbar.