.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();
}