FileIO.WriteAsync挂起

时间:2012-11-11 17:53:55

标签: c# windows io windows-8 windows-store-apps

我正在尝试使用基本的Windows 8商店应用,只需创建一个新文件并将一些示例数据写入其中。但是,当我运行该功能时,我写了应用程序挂起并变得无法响应。我尝试了两种不同的文件创建方法,它们都具有相同的效果:

使用漫游文件夹:

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 个答案:

答案 0 :(得分:3)

我怀疑在你的调用层次结构的某个地方,你在异步方法上同步阻塞(例如,Task.WaitTask.Result)。

这可以防止您的方法继续同步回UI线程,从而导致死锁。 I explain this deadlock scenario in full detail on my blog

有两条准则可以解决这个问题:

  1. 一直使用async。不要阻止async代码。将Task.Wait / Task.Result替换为await并允许其增长。
  2. 配置您的上下文。如果async方法不需要在await之后访问UI元素(或数据绑定属性),请使用ConfigureAwait(false)