异步调用引用设备未完成

时间:2014-04-29 12:53:24

标签: c# windows-store-apps visual-studio-2013

我正在使用可以访问设备麦克风的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上进行开发。我尝试在本地计算机和模拟器模式下进行调试,但两者都具有相同的结果。我确实在应用程序的清单中选择了麦克风功能。我希望操作系统应该提示我访问麦克风设备,但我没有看到该对话框。

非常感谢任何帮助!提前谢谢。

1 个答案:

答案 0 :(得分:2)

我怀疑你的调用堆栈越来越强,你通过调用Task.WaitTask<T>.Result阻止了UI线程。这将cause a deadlock,正如我在博客上解释的那样。

这种死锁的原因是因为await捕获了“上下文”(在本例中是UI上下文)并将使用它来恢复其async方法。但是,如果UI线程被阻止,则async方法无法继续。