我发现在我的应用连续泄漏。 使用内存分析器检查后,我发现课程是由微软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 KB
说起...内存:42312 KB
说起...内存:42440 KB
说起...内存:42568 KB
说起...内存:42696 KB
说起...内存:42824 KB
说起...内存:43016 KB
说起...内存:43372 KB
我用Google搜索了一下,发现很多人都遇到了同样的问题:1 在SpeechSynthesizer常量内存泄漏 2: http://connect.microsoft.com/VisualStudio/feedback/details/664196/system-speech-has-a-memory -泄漏
但可悲的是我没有找到任何解决的办法。 由于它的问题已经问很久以前的事了,所以我想问问,如果它解决了没有?
非常感谢。
更新:
好像在我切换使用SAPI的COM DLL而不是净Speech.Synthesizer包(虽然本质上它们是一回事),内存泄漏停止。
为什么两个调用行为(SAPI DLL VS .NET语音包)有不同的内存的行为呢? 由于后者似乎只是一个包装前SAPI DLL。
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 KB
说起...内存:32044 KB
说起...内存:32044 KB
说起...内存:32044 KB
说起...内存:32044 KB
说起...内存:32044 KB
说起...内存:32044 KB
说起...内存:32044 KB