我正在使用我嘗試使用的aync方法遇到一些意外/不想要的行爲。異步方法是RecognizeAsync
。我無法等待此方法,因爲它返回void。發生什麼事情是,ProcessAudio
方法將首先被調用,並將看似運行到完成,但網頁永遠不會返回我的「聯繫人」視圖,因爲它應該或錯誤了。該方法運行完成後,我的處理程序中的斷點開始被擊中。如果我讓它播放完成,將不會發生重定向 - 在Chrome調試器的網絡選項卡中,「狀態」將保持標記爲掛起狀態並且只是掛在那裏。我相信我的問題是由異步問題引起的,但一直未能發現它究竟是什麼。異步方法中的意外行爲
所有幫助表示讚賞。
[HttpPost]
public async Task<ActionResult> ProcessAudio()
{
SpeechRecognitionEngine speechEngine = new SpeechRecognitionEngine();
speechEngine.SetInputToWaveFile(Server.MapPath("~/Content/AudioAssets/speechSample.wav"));
var grammar = new DictationGrammar();
speechEngine.LoadGrammar(grammar);
speechEngine.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(SpeechRecognizedHandler);
speechEngine.SpeechHypothesized += new EventHandler<SpeechHypothesizedEventArgs>(SpeechHypothesizedHandler);
speechEngine.RecognizeAsync(RecognizeMode.Multiple);
return View("Contact", vm); //first breakpoint hit occurs on this line
//but it doesnt seem to be executed?
}
private void SpeechRecognizedHandler(object sender, EventArgs e)
{
//do some work
//3rd breakpoint is hit here
}
private void SpeechHypothesizedHandler(object sender, EventArgs e)
{
//do some different work
//2nd breakpoint is hit here
}
更新:根據建議,我已經改變了我的代碼(在ProcessAudio):
using (speechEngine)
{
speechEngine.SetInputToWaveFile(Server.MapPath("~/Content/AudioAssets/speechSample.wav"));
var grammar = new DictationGrammar();
speechEngine.LoadGrammar(grammar);
speechEngine.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(SpeechRecognizedHandler);
speechEngine.SpeechHypothesized += new EventHandler<SpeechHypothesizedEventArgs>(SpeechHypothesizedHandler);
var tcsRecognized = new TaskCompletionSource<EventArgs>();
speechEngine.RecognizeCompleted += (sender, eventArgs) => tcsRecognized.SetResult(eventArgs);
speechEngine.RecognizeAsync(RecognizeMode.Multiple);
try
{
var eventArgsRecognized = await tcsRecognized.Task;
}
catch(Exception e)
{
throw (e);
}
}
,這是導致一些錯誤的行爲: 的return View("Contact",vm)
斷點現在將擊中後的處理程序已完成發射,但仍然沒有發生任何重定向。我從未被定向到我的聯繫頁面。我只是像以前一樣無限期地仔細檢查我的原始頁面。
爲什麼不等'speechEngine.RecognizeAsync(RecognizeMode.Multiple);'? –
嘗試「await」時返回void的異步方法時發生編譯器錯誤 – GregH
@ErikPhilips這是舊式基於事件的asyncrony,它使用與新型樣式基於TAP的異步相交的命名約定。 'WebClient'也分享了這個不幸的命名衝突。 – spender