根据标题。我单击我的按钮,可以在调用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时,我得到相同的结果。
我错过了一些明显的东西吗?
答案 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();
}