Ich erfahre derzeit unerwartetes/unerwünschtes Verhalten mit einer Synchronisierungsmethode, die ich versuche zu verwenden. Die asynchrone Methode ist RecognizeAsync
. Ich kann diese Methode nicht erwarten, da sie ungültig wird. Was passiert, ist, dass ProcessAudio
Methode zuerst aufgerufen wird und scheinbar bis zum Ende ausgeführt wird, aber die Webseite nie meine "Kontakt" -Ansicht zurückgibt, wie es sollte oder Fehler aus. Nachdem die Methode vollständig ausgeführt wurde, werden die Haltepunkte in meinen Handlern gestartet. Wenn ich es bis zum Ende durchspielen lasse, wird es niemals eine Umleitung geben - auf der Netzwerk-Registerkarte im Chrome-Debugger bleibt der "Status" als ausstehend markiert und hängt einfach dort. Ich glaube, dass mein Problem durch Probleme mit der Asynchronität verursacht wurde, aber ich konnte nicht herausfinden, was genau das ist.Unerwartetes Verhalten in der asynchronen Methode
Alle Hilfe ist willkommen.
[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:
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);
}
}
und dies in einem gewissen falschen Verhalten resultierende: basierend auf Anregungen, ich meinen Code (in ProcessAudio) geändert haben Der return View("Contact",vm)
Breakpoint wird nun nach dem Treffer werden Handler sind fertig feuern, aber es gibt immer noch keine Umleitung, die jemals passiert. Ich bin nie auf meine Kontaktseite verwiesen. Ich habe meine Originalseite auf unbestimmte Zeit genau wie vorher.
Warum nicht 'erwarten speechEngine.RecognizeAsync (RecognizeMode.Multiple);'? –
Compiler-Fehler beim Versuch, eine asynchrone Methode abzufragen, die void zurückgibt – GregH
@ErikPhilips Es handelt sich um eine ereignisbasierte asynchrone Methode im alten Stil, die eine Namenskonvention verwendet, die sich mit der neueren TAP-basierten Asynchronität überschneidet. 'WebClient' teilt auch diesen unglücklichen Namenskonflikt. – spender