.net FileOpenPicker.PickSingleFileAsync永远不会返回

.net FileOpenPicker.PickSingleFileAsync永远不会返回,.net,windows-8,visual-studio-2012,async-await,.net,Windows 8,Visual Studio 2012,Async Await,根据标题。我单击我的按钮,可以在调用openPicker.PickSingleFileAsync()行上的断点处进入调试器,但此调用永远不会返回。我可以选择一个文件,然后单击“打开”,但我永远不会回到我的方法中来实际处理该文件。这一切都在一个新的Windows Metro“空白应用程序”中,只有一个按钮和一个图像 private void Button_Click_1(object sender, RoutedEventArgs e) { OpenFile().W

根据标题。我单击我的按钮,可以在调用
openPicker.PickSingleFileAsync()
行上的断点处进入调试器,但此调用永远不会返回。我可以选择一个文件,然后单击“打开”,但我永远不会回到我的方法中来实际处理该文件。这一切都在一个新的Windows Metro“空白应用程序”中,只有一个按钮和一个图像

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        OpenFile().Wait();
    }

    private async Task OpenFile()
    {
        FileOpenPicker openPicker = new FileOpenPicker();
        openPicker.ViewMode = PickerViewMode.Thumbnail;
        openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
        openPicker.FileTypeFilter.Add(".jpg");
        openPicker.FileTypeFilter.Add(".jpeg");
        openPicker.FileTypeFilter.Add(".png");

        // can break on following line
        var file = await openPicker.PickSingleFileAsync();

        // this line is never reached
        if (file != null)
        {
           // do stuff
        }
    }
这与示例代码一致。当我使用PickMultipleFileAsync时也会得到同样的结果


我是不是遗漏了一些明显的东西?

在GUI应用程序中,永远不要将
Wait()
Wait
混合使用,因为这很容易导致死锁,就像您正在经历的一样

因此,如果您可以使用
Wait
,您可能根本不应该使用
Wait()
(尽管有例外:在使用
Wait
的控制台应用程序的
Main()
方法中使用
Wait()
是有意义的)

这里的问题是
Wait()
阻塞了UI线程。完成文件选取器后,它会安排方法的其余部分在UI线程上运行,但该线程无法这样做,因为它正在等待此操作完成。因此,要完成此操作,首先必须完成,这是一个死锁

这里的解决方案是在事件处理程序中也使用
wait

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    await OpenFile();
}

决不能在GUI应用程序中混合使用
Wait()
Wait
,因为这很容易导致死锁,正如您所经历的那样

因此,如果您可以使用
Wait
,您可能根本不应该使用
Wait()
(尽管有例外:在使用
Wait
的控制台应用程序的
Main()
方法中使用
Wait()
是有意义的)

这里的问题是
Wait()
阻塞了UI线程。完成文件选取器后,它会安排方法的其余部分在UI线程上运行,但该线程无法这样做,因为它正在等待此操作完成。因此,要完成此操作,首先必须完成,这是一个死锁

这里的解决方案是在事件处理程序中也使用
wait

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    await OpenFile();
}