2012-05-10 75 views
1

按照标题。我点击我的按钮,并且可以在调用openPicker.PickSingleFileAsync()的线上的断点处输入调试器 - 但这个调用永远不会返回。我可以选择一个文件,然后单击“打开”,但我从来没有回到我的方法来实际上对该文件执行某些操作。这是全新的Windows Metro空白应用程序,只有一个按钮和一个图像。FileOpenPicker.PickSingleFileAsync永不返回

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时也会得到相同的结果。

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

回答

8

您不应该在GUI应用程序中混合使用Wait()await,因为它可能非常容易导致死锁,正如您所遇到的一样。

对于这个问题,你可能不应该使用Wait()可言,如果你可以使用await(虽然也有例外:它是有道理的使用await控制台应用程序的方法Main()使用Wait())。

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

这里的解决方案在事件处理也被使用await

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