2013-04-04 60 views
3

我正在嘗試使用SpeakAsync()方法講一些文本。但是,直到我打電話說Speak()之前,它纔開始說話。我不想打電話說()。如果我從這個代碼沒有刪除說話()方法被調用都:SpeechSynthesizer.SpeakAsync方法不立即講

 using (SpeechSynthesizer synth = new SpeechSynthesizer()) 
     { 

      synth.SelectVoice("ScanSoft Emily_Dri20_22kHz"); 

      synth.Rate = 10; 
      synth.Volume = 100; 

      synth.SpeakAsync("oh, i'm a lumberjack and i'm okay! I sleep all night and I work all day!"); 
      synth.SpeakAsync("If he was dying he wouldn't bother writing ah! He'd just say it!"); 
      synth.Speak("i don't want to go on the cart."); 
      synth.SpeakAsync("We don't have a lord. We're an anarcho-syndicalist commune."); 
      synth.SpeakAsync("If you do not show us the grail, we shall take your castle by force!"); 
      synth.Speak("what do you mean, an african swallow or a european swallow?"); 

UPDATE:

看來其他人有這個問題,但沒有解決辦法尚未找到:

other people having this problem

+0

這是一個控制檯應用程序? – keyboardP 2013-04-04 11:41:32

+0

是的。這是一個控制檯應用程序。我從MSDN複製粘貼了一些示例代碼,然後試圖擴展它。 – gonzobrains 2013-04-04 11:43:28

回答

5

這是因爲Speak是阻止調用程序運行。由於您將其作爲控制檯應用程序運行,因此請在代碼末尾添加Console.ReadKey();以確保應用程序保持運行狀態,直到用戶按下某個鍵。

否則,主線程將退出,因爲SpeakAsync會立即返回,所以您的程序正在通過所有這些線路飛行,然後退出,這就是爲什麼您什麼都聽不到。

更新基於意見 -

using塊被處置的SpeechSynthesizer幾乎立即這就是爲什麼沒有什麼可以聽到。您可以將Console.ReadKey();放置在using區塊的大括號之前,或者刪除using區塊並稍後手動處理。

+0

我確實有。這些行之後我實際上有更多的代碼。我只包括相關的片段。即使在通過調試器時,SpeakAsync()調用也不會執行任何操作,直到進行Speak()調用。然後,除了提供給Speak()方法的文本之外,還可以使用所有前面的文本。 – gonzobrains 2013-04-04 11:49:20

+3

您的異步代碼位於'using'塊中,因此幾乎可以立即處理SpeechSynthesizer。或者移除'using'塊並手動處理配置,或者在'using'塊關閉之前放置'Console.ReadKey()'。 – keyboardP 2013-04-04 11:51:35

+0

你知道,那似乎奏效了。我昨天晚上試着去除它,但它似乎沒有做任何不同的事情。我不知道爲什麼它現在正在工作。也許我只是累了。如果您發佈了新答案,我會接受它。 – gonzobrains 2013-04-04 18:08:07