FileOpenPicker.PickSingleFileAsync永远不会返回

时间:2012-05-10 10:43:45

标签: .net windows-8 visual-studio-2012 async-await

根据标题。我单击我的按钮,可以在调用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
        }
    }

这是根据示例代码on MSDN here。当我使用PickMultipleFilesAsync时,我得到相同的结果。

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:8)

你永远不应该在GUI应用程序中混合Wait()await,因为它很容易导致死锁,就像你遇到的那样。

就此而言,如果您可以使用Wait(),则可能根本不应使用await(尽管有例外情况:在{{Wait()中使用Main()是有意义的1}}使用await)的控制台应用程序的方法。

这里的问题是Wait()会阻止你的UI线程。文件选择器完成后,它会调度方法的其余部分以在UI线程上运行,但线程无法执行此操作,因为它正在等待此操作完成。因此,要完成此操作,首先必须完成,这是一个死锁。

此处的解决方案也是在您的事件处理程序中使用await

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