c# - FileIO.WriteAsync 挂起

标签 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 字节之一),但我实际上无法用它做任何事情。

最佳答案

我怀疑您的调用层次结构中的某个位置正在同步阻塞异步方法(例如 Task.WaitTask.Result )。

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

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

  1. 使用async一直往下。不要阻止async代码。替换Task.Wait/Task.Resultawait并让它成长。
  2. 配置您的上下文。如果您async方法不需要在 await 之后访问 UI 元素(或数据绑定(bind)属性) ,然后使用ConfigureAwait(false) .

关于c# - FileIO.WriteAsync 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333786/

相关文章:

c# - Exchange Server 登录凭据设置

c# - 引入FOREIGN KEY约束错误问题

c++ - 如何在windows平台上使用c++信号

c# - 创建 CNG key 的权限

c# - 带有 String keySelector 的 OrderBy

c# - 如何在 LINQ 中对单个连接中的多个字段进行连接

java - 如何在 JComponent 中显示 ArrayList 项

c - 强制使用 `exec` 创建的程序执行无缓冲 I/O

windows - 使用 awk 将多行文件转换为 TSV

json - 如何从 python 中的文件读取 JSON 文件列表?