私は現在、使用しようとしている非同期メソッドで予期せぬ/望ましくない動作が発生しています。非同期メソッドはRecognizeAsync
です。 voidを返すので、私はこのメソッドを待つことができません。何が起きているのですか?ProcessAudio
メソッドが最初に呼び出され、一見一貫して実行されますが、Webページは決して私の "Contact"ビューを返しません。メソッドが完了すると、ハンドラ内のブレークポイントがヒットし始めます。私が完了まで再生すると、リダイレクトは起こりません - クロムデバッガのネットワークタブでは、 "ステータス"は保留中とマークされたままになります。私は自分の問題が非同期性の問題によって引き起こされていると確信していますが、正確には何かを発見できませんでした。非同期メソッドで予期しない動作が発生しました
すべてのご協力をいただきありがとうございます。
[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
}
UPDATE:提案に基づいて、私は(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)
ブレークポイントは現在、AFTERヒットしますハンドラは終了しますが、リダイレクトはまだ発生しません。私は私の連絡先ページには決して指示されません。以前と同じように無期限にオリジナルページを読み込んでいます。
「await speechEngine.RecognizeAsync(RecognizeMode.Multiple); –
voidを返す非同期メソッドを 'await'しようとするとコンパイラエラーが発生する – GregH
@ErikPhilips新しいスタイルのTAPベースの非同期と交差する命名規則を使用する古いスタイルのイベントベースの非同期です。 'WebClient'もこの不幸な命名の衝突を共有します。 – spender