2017-04-24 7 views
0

をフリーズします。それがStorageFolder.GetFilesAsync()に到達すると、アプリケーションがフリーズし、決して回復しません。StorageFolder.GetFilesAsyncは()私はローカルディレクトリにインストールディレクトリからXMLのconfigureファイルを移動しようとしていますUWPとWinRTのアプリ

私はそれが公共の方法で非同期にすることはできませんので、私は呼び出していたコードは、Windows RTプロジェクト内にあります。クライアントのUWPアプリメソッドを非同期呼び出しにすると、違いはありません。すぐに、あなたの問題を解決し、そのメソッドpublic asyncを作り、RunAsyncコールにタスクを、それを伝承する

private async void InstallButton_Click(object sender, RoutedEventArgs e) 
{ 
    await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
    { 
     bool installed = FileManager.Install(StorageLocation.Local); 
    }); 

} 

public static bool Install(StorageLocation location) 
{ 
    return InstallAsync(location).Result; 
} 

private static async Task<bool> InstallAsync(StorageLocation location) 
{ 
    try 
    { 
     StorageFolder destinationFolder = null; 
     if (location == StorageLocation.Local) 
     { 
      destinationFolder = ApplicationData.Current.LocalFolder; 
     } 
     else if (location == StorageLocation.Roaming) 
     { 
      destinationFolder = ApplicationData.Current.RoamingFolder; 
     } 

     if (destinationFolder == null) 
     { 
      return false; 
     } 

     StorageFolder folder = Package.Current.InstalledLocation; 
     if (folder == null) 
     { 
      return false; 
     } 

     // Language files are installed in a sub directory 
     StorageFolder subfolder = await folder.GetFolderAsync(languageDirectory); 
     if (subfolder == null) 
     { 
      return false; 
     } 

     // Get a list of files 

     IReadOnlyList<StorageFile> files = await subfolder.GetFilesAsync(); 

     foreach (StorageFile file in files) 
     { 
      if (file.Name.EndsWith(".xml")) 
      { 
       await file.CopyAsync(destinationFolder); 
      } 
     } 
    } 
    catch (Exception) 
    { } 

    return IsInstalled(location); 
} 
+1

待機する代わりにボタンクリックで 'await FileManager.InstallAsync(StorageLocation.Local);'を呼び出すようにしてください。非同期コードを同期して実行しないでください。[Stephen Clearyのブログ](https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html)でデッドロックについて読むことができます。別のもの - IsInstalled(location)とは何ですか? - 非同期コード( '.Result'など)を同期的に待つ別の方法ですか? – Romasz

+0

別の質問 - なぜDistpatcher *でこれを実行するのですか? – Romasz

答えて

0

private async void InstallButton_Click(object sender, RoutedEventArgs e) 
{ 
    await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
    { 
     bool installed = await FileManager.InstallAsync(StorageLocation.Local); 
    }); 
} 

また、FileManagerはUIを変更しますか?そうでなければ、ディスパッチャーなしで直接それを待つことができます。

private async void InstallButton_Click(object sender, RoutedEventArgs e) 
{ 
    bool installed = await FileManager.InstallAsync(StorageLocation.Local); 
} 
+0

UIを変更するかどうかに関わらず、 'InstallAsync()'メソッドを待つことができると思います(そうすべきではありませんが、それは問題ではありません)。なぜ上記の提案は 'RunAsync()'を使って示唆していますか?メソッドが 'await'ステートメントにあるときにUIスレッドがブロックされていると誤解されていますか? –

+0

クイック返信をありがとう。私はUIを更新する必要はありません。これの問題は、FileManagerがWinRTプロジェクトにあることです。タスクを返すことはできません。そのため、私はInstallラッパーメソッドを作成してそれを解決しようとしています。私はdoesntの仕事を推測する。たぶん例外メッセージで提案されているWindowsランタイムタイプの1つに変更することができます。 – Haydn

+0

あなたが指摘した質問が私が尋ねた質問のようなものではない場合、あなたはそれを重複としてマークしました。 – Haydn

関連する問題