2012-05-10 156 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(); 
}