2012-05-10 3 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

awaitをGUIアプリケーションに混ぜて使用しないでください。デッドロックが発生する可能性があります。そのことについては

(例外はありますが:それはawaitを使用するコンソールアプリケーションのMain()方法でWait()を使用することは理にかなって)あなたはawaitを使用することができれば、あなたはおそらく、まったくWait()を使用しないでください。

ここでの問題は、があなたのUIスレッドをブロックすることです。ファイルピッカーが完了すると、残りのメソッドがUIスレッド上で実行されるようスケジュールされますが、スレッドはこの操作が完了するのを待っているため、そのスレッドを実行できません。したがって、この操作を完了するには、最初に完了する必要があります。これはデッドロックです。

ここに解決策があまりにもあなたのイベントハンドラで awaitを使用している

private async void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    await OpenFile(); 
} 
関連する問題