我有一个WP8应用程序,它使用无UI版本的SpeechRecognizer
。我使用以下代码:
string[] commands = { "Shoot" };
recognizer = new SpeechRecognizer();
await speechOutput.SpeakTextAsync("You can say Shoot.");
recognizer.Grammars.AddGrammarFromList("captureCommands", commands);
SpeechRecognitionResult result = await recognizer.RecognizeAsync();
if (result.Text == "Shoot")
cam.CaptureImage();
这会在语音和屏幕文本中提示用户可以说"拍摄"来拍照。其他三个选项是:
- 点按屏幕进行拍摄
- 单击
ApplicationBar
中的拍摄按钮 - 单击
ApplicationBar
上的 a 按钮以从照片库中进行选择
在所有三种情况下,我都想取消语音识别器任务。我尝试删除await
并将IAsyncOperation<SpeechRecognitionResult>
转换为Task<SpeechRecognitionResult>
,但由于我没有创建任务并且该方法不采用取消令牌,因此我不知道如何取消它,即使现在我有了任务对象。
如果我不取消任务并离开页面,则会出现应用级别异常。有没有办法显式取消任务或等待的操作?
无法取消不可取消的异步操作。如果该方法不接受取消令牌,则基本上无法取消它。您可以做的是:
- 放弃使用
WithCancellation
或WithTimeout
的操作。 - 处理
SpeechRecognizer
(这是一个IDisposable
)并抓住它的ObjectDisposedException
。
这是我对一个类似但不相同的问题的解决方案:异步网络操作永远不会完成