c#、WPF、および System.Speech.Synthesizer オブジェクトを使用する、リリースしたいプロジェクトを開発しました。このプロジェクトのリリースを妨げている問題は、SpeakAsync が呼び出されるたびにメモリ リークが発生し、最終的には失敗に至ることです。このオブジェクトを使用した後、適切にクリーンアップしたと思いますが、治療法が見つかりません。Ants Memory Profiler を使用してプログラムを実行したところ、呼び出しごとに WAVEHDR と WaveHeader が増加していることが報告されました。
原因を特定するためにサンプルプロジェクトを作成しましたが、まだ途方に暮れています。どんな助けでも大歓迎です。
このプロジェクトは VS2008 を使用し、.NET 3.5 および任意の CPU をターゲットとする ac# WPF プロジェクトです。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 オブジェクトを作成しようとすると実行され、最終的に停止します。Windows Vista 64 ビットで実行すると、メモリは 34k の開始点から約 400k まで増加し、さらに増加します。
これを引き起こしている可能性のあるコードの何かを誰でも見ることができますか、それとも Speech オブジェクト自体の問題ですか?
どんな助けでも大歓迎です。