1

按照标题。我单击我的按钮,然后可以在调用行上的断点处进入调试器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
        }
    }

这是按照MSDN here 上的示例代码。当我使用 PickMultipleFilesAsync 时,我也会得到相同的结果。

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

4

1 回答 1

8

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

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

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

这里的解决方案也在await您的事件处理程序中使用:

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    await OpenFile();
}
于 2012-05-10T11:28:45.820 回答