Konstanter Speicherverlust im SpeechSynthesizer

8

Ich habe ein Projekt entwickelt, welches ich mit c #, WPF und dem System.Speech.Synthesizer-Objekt veröffentlichen möchte. Das Problem, das die Veröffentlichung dieses Projekts verhindert, besteht darin, dass jedes Mal, wenn SpeakAsync aufgerufen wird, ein Speicherverlust zurückbleibt, der bis zu dem Punkt des endgültigen Fehlers wächst. Ich glaube, ich habe nach der Verwendung dieses Objekts richtig aufgeräumt, kann aber keine Heilung finden. Ich habe das Programm über Ants Memory Profiler ausgeführt und es berichtet, dass WAVEHDR und WaveHeader mit jedem Anruf wächst.

Ich habe ein Beispielprojekt erstellt, um die Ursache zu ermitteln, bin aber immer noch ratlos. Jede Hilfe wäre willkommen.

Das Projekt verwendet VS2008 und ist ein c # WPF-Projekt, das auf .NET 3.5 und Any CPU abzielt. Sie müssen einen Verweis auf System.Speech manuell hinzufügen.

Hier ist der Code:

%Vor%

%Vor%

Ich führe dieses Programm auf Windows 7 64 Bit aus und es wird ausgeführt und schließlich angehalten, wenn versucht wird, ein neues SpeechSynthesizer-Objekt zu erstellen. Unter Windows Vista 64 bit wird der Speicher von einem Startpunkt von 34k auf bis zu 400k wachsen und wachsen.

Kann irgendjemand etwas im Code sehen, der das verursacht, oder ist das ein Problem mit dem Speech-Objekt selbst?

Jede Hilfe wäre willkommen.

    
DudeFX 04.02.2010, 23:29
quelle

4 Antworten

5

Dies ist ein bekanntes Problem in der Speak-Methode. Eine Struktur namens SPVTEXTFRAG wird erstellt und nie zerstört.

Details hier: Ссылка

    
pandalink 17.09.2011 19:41
quelle
3

Ich kann diese Beobachtung bestätigen. Ich zog meine Haare aus und versuchte herauszufinden, wo mein Programm undicht war und es ist die .SPEAK-Methode in System.speech

Ich habe eine App konvertiert, die die COM-basierten Sprachobjekte verwendet, um die neue System.Speech.Net-Bibliothek in .Net 3.5 zu verwenden. Es klingt wie der richtige Weg, um den gesamten Code in der .Net App zu verwenden. Die App hatte plötzlich ein kleines Mem-Leck.

Ich habe das in zwei einfache Apps aufgeteilt, die "das ist ein Test" in eine WAV-Datei von gesprochenen Wörtern konvertieren. Einer verwendet die COM-basierten Sprachobjekte, der andere verwendet System.Speech. Ich habe sie 24 Stunden lang laufen lassen, wobei jeder WAV ungefähr 200.000 Mal erstellt hat.

COM-basierte Sprachobjekte: kein Mem-Leak. Mem-Nutzung der App erreichte nach ca. 40 Minuten ihren Höhepunkt bei 13 MB.

System.Speech: langsames Leck, schön und linear. Innerhalb von 24 Stunden von ca. 14MB auf 45MB gelaufen

    
dao 14.03.2010 12:56
quelle
2

SendAsync() von Ping leckt ebenfalls. Die Lösung besteht darin, den Absender zuerst als IDisposable zu übergeben. Vielleicht funktioniert das Folgende auch hier.

%Vor%     
Terentius 26.08.2010 01:26
quelle
0

Ich kann Ihnen eine wirklich einfache Antwort für Ihre Frage geben: Machen Sie den SpeechSynthesizer statisch !!!

Ich bin mir ziemlich sicher, dass dies Ihr Problem lösen wird.

Auch - ein Tipp == & gt; & gt; Jedes Mal, wenn Sie programmieren, und Sie haben eine Ressource ... verwenden Sie es als statisch und Ihr Leben wäre besser!

    
Yuki 15.02.2012 19:07
quelle