2

私は基本的なWindows8ストアアプリで作業しようとしています。新しいファイルを作成し、それにサンプルデータを書き込むだけです。ただし、作成した関数を実行すると、アプリがハングして応答しなくなります。私はファイル作成の2つの別々の方法を試しましたが、どちらも同じ効果があります。

ローミングフォルダの使用:

Windows.Storage.StorageFolder roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
StorageFile file = await roamingFolder.CreateFileAsync("test.txt",CreationCollisionOption.ReplaceExisting);
string[] data = { "New project", "000000000" , "" };
await FileIO.WriteTextAsync(file, data[0]);
return new Project(file.Path, "New project", "", Windows.UI.Color.FromArgb(255, 0, 0, 0));

ファイルピッカーを使用する場合:

Windows.Storage.Pickers.FileSavePicker fsp = new Windows.Storage.Pickers.FileSavePicker();
        fsp.FileTypeChoices.Clear();
        fsp.FileTypeChoices.Add("Plain Text", new List<string>() { ".jwp" });
        fsp.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
        fsp.SuggestedFileName = "New Project";
        StorageFile file = await fsp.PickSaveFileAsync();
        if (file != null)
        {
            string[] data = { "New project", "000000000" , "" };
            CachedFileManager.DeferUpdates(file);
            await FileIO.WriteLinesAsync(file, data);
            Windows.Storage.Provider.FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(file);
            if (status == Windows.Storage.Provider.FileUpdateStatus.Complete)
            {
                return new Project(file.Path, "New project", "", Windows.UI.Color.FromArgb(255, 0, 0, 0));
            }
            else
            {
                return null;
            }
        }
        else
        {
            return null;
        }

毎回、それがぶら下がっているように見える線は次のとおりです。

await FileIO.WriteTextAsync(file,data[0]);

また:

await FileIO.WriteLinesAsync(file,data);

それぞれ。

誰かがここで何が起こっているのか分かりますか?ピッカーで選択したドライブには確かにスペースがあり、ピッカーメソッドが確実にファイルを作成していることもわかります(サイズは0バイトの1つですが)が、実際には何もできません。

4

1 に答える 1

3

呼び出し階層のどこかで、非同期メソッド(、、Task.WaitなどTask.Result)を同期的にブロックしていると思われます。

これにより、メソッドの継続が同期してUIスレッドに戻り、デッドロックが発生するのを防ぎます。このデッドロックシナリオについては、ブログで詳しく説明しています。

これを修正するために従うべき2つのガイドラインがあります:

  1. asyncずっと下に使用してください。asyncコードをブロックしないでください。Task.Wait/Task.Resultを置き換えawaitて、成長させます。
  2. コンテキストを構成します。asyncメソッドが、の後にUI要素(またはデータバインドされたプロパティ)にアクセスする必要がない場合は、awaitを使用しますConfigureAwait(false)
于 2012-11-11T21:26:48.027 に答える