我正在尝试使用基本的Windows 8商店应用程序,只需创build一个新文件并向其中写入一些示例数据即可。 但是,当我运行我写的应用程序挂起,并变得无法响应的function。 我已经尝试了两种独立的文件创build方法,它们都具有相同的效果:
使用漫游文件夹:
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));
使用文件select器:
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);
分别。
有人知道这里发生了什么? 我在select器中select的驱动器上有一定的空间,我甚至能够看到select器方法确实正在创build一个文件(虽然大小为0字节),但是我无法做任何事情。
我怀疑你的调用层次结构的某个地方,你正在同步阻塞一个异步方法(例如, Task.Wait
或Task.Result
)。
这可以防止你的方法继续同步到UI线程,导致死锁。 我在博客上详细解释了这个死锁情况 。
有两个指导方针可以解决这个问题:
async
。 不要阻止async
代码。 将Task.Wait
/ Task.Result
替换为await
并允许它增长。 async
方法在await
之后不需要访问UI元素(或数据绑定属性),则使用ConfigureAwait(false)
。