【发布时间】:2013-06-08 14:21:11
【问题描述】:
我正在制作一个 windows phone 8 应用程序。此应用程序的一部分需要保存状态。我将它保存为一串Json。如果我打开应用程序,保存一些数据,退出应用程序并再次加载它,它会挂在 GetFolderAsync 或 OpenStreamForReadAsync 上。不是每次都这样,但是一旦开始挂起,我必须杀死整个模拟器并创建一个新的模拟器才能再次启动应用程序。
我什至尝试过创建一个没有数据的空文件,但问题仍然存在。
下面是我用来保存和加载数据的代码。不管我在哪里调用数据加载,无论是在应用程序启动时还是在表单加载时,它仍然会中断。
private async Task SaveLists()
{
//XmlSerializer serializer = new XmlSerializer(typeof(ListHolder));
// Get the local folder.
StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;
// Create a new folder name DataFolder.
var dataFolder = await local.CreateFolderAsync("DataFolder",
CreationCollisionOption.OpenIfExists);
// Create a new file named DataFile.txt.
var file = await dataFolder.CreateFileAsync("Lists.json",
CreationCollisionOption.ReplaceExisting);
string json = JsonConvert.SerializeObject(Lists, Formatting.Indented);
byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(json.ToCharArray());
using (var s = await file.OpenStreamForWriteAsync())
{
s.Write(fileBytes, 0, fileBytes.Length);
}
}
private async Task LoadLists()
{
// Get the local folder.
StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;
if (local != null)
{
try
{
// Get the DataFolder folder.
var dataFolder = await local.GetFolderAsync("DataFolder");
// Get the file.
var files = dataFolder.GetFilesAsync();
var file = await dataFolder.OpenStreamForReadAsync("Lists.json");
string jsonString = "";
// Read the data.
using (StreamReader streamReader = new StreamReader(file))
{
jsonString = streamReader.ReadToEnd();
}
if (jsonString.Length > 0)
{
Lists = JsonConvert.DeserializeObject<List<ItemList>>(jsonString);
}
else
{
Lists = new List<ItemList>();
}
}
catch (Exception ex)
{
Lists = new List<ItemList>();
}
}
}
【问题讨论】:
-
您是否检查过该文件夹是否真的存在并包含您希望它包含的数据? (我的意思是,手动,而不是编程。)
-
@Richard - 你如何调用你的函数? 1)
await LoadLists(), 或 2)LoadLists().Wait()? -
我调用的是这样的:await LoadLists();
-
不幸的是,我看不到文件夹和文件是否真的存在,因为它们作为应用程序的一部分在手机上。有没有办法在没有代码的情况下实际看到它们?我确实调用了 GetFoldersAsync,我可以在 Quickwatch 窗口中看到该文件夹
-
@RichardMannion:你的调用堆栈中有
Wait或Resultanywhere 吗?或者这一切都是从async void事件处理程序开始的?
标签: asynchronous windows-phone-8 io