我正在使用可以访问设备麦克风的Windows应用商店应用。但是,当我尝试使用媒体设备时,执行会在等待某个地方时丢失。到目前为止,我已经注意到以下三种情况:
var devices = await DeviceInformation.FindAllAsync(DeviceClass.AudioCapture); // never returns
var inputDeviceId = MediaDevice.GetDefaultAudioCaptureId(AudioDeviceRole.Communications);
var device = await DeviceInformation.CreateFromIdAsync(inputDeviceId); // never returns
var mediaCapture = new MediaCapture();
var settings = new MediaCaptureInitializationSettings
{
StreamingCaptureMode = StreamingCaptureMode.Audio,
AudioProcessing = AudioProcessing.Default,
MediaCategory = MediaCategory.Other,
AudioDeviceId = inputDeviceId,
VideoDeviceId = "",
};
try
{
await _mediaCapture.InitializeAsync(settings); // never returns
}
catch (Exception ex)
{
throw new Exception("Microphone is not available.", ex);
}
我正在使用Visual Studio 2013 Update 2 RC并在Surface Pro 2上进行开发。我尝试在本地计算机和模拟器模式下进行调试,但两者都具有相同的结果。我确实在应用程序的清单中选择了麦克风功能。我希望操作系统应该提示我访问麦克风设备,但我没有看到该对话框。
非常感谢任何帮助!提前谢谢。
答案 0 :(得分:2)
我怀疑你的调用堆栈越来越强,你通过调用Task.Wait
或Task<T>.Result
阻止了UI线程。这将cause a deadlock,正如我在博客上解释的那样。
这种死锁的原因是因为await
捕获了“上下文”(在本例中是UI上下文)并将使用它来恢复其async
方法。但是,如果UI线程被阻止,则async
方法无法继续。