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