我正在使用我尝试使用的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