我正在开发一个订阅播客功能的Windows Phone 8应用。
当应用程序运行时,用户可以单击订阅按钮,他们正在查看的节目将添加到App.xaml.cs文件中维护的List<Show>
。
当应用程序停用时,我尝试将List<Show>
中的数据写入json,然后将其保存到LocalFolder目录中的磁盘上。这里是我的代码:
public async Task<bool> SaveSubscriptions(List<Show> subs)
{
try
{
string data = JsonConvert.SerializeObject(subs, Formatting.Indented);
Byte[] bytes = Encoding.UTF8.GetBytes(data);
StorageFolder folder = await ApplicationData.Current.LocalFolder.GetFolderAsync("Subscriptions");
using (Stream writer = await folder.OpenStreamForWriteAsync("subscriptions.json", CreationCollisionOption.ReplaceExisting))
{
writer.Seek(0, SeekOrigin.End);
await writer.WriteAsync(bytes, 0, bytes.Length);
}
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
return false;
}
return true;
}
你可以看到我试图将数据写入名为Subscriptions的目录中名为subscriptions.json的文件中。如果App尚未启动,则会在App启动时创建Subscriptions目录。这部分工作正常。 我遇到的问题是GetFolderAsync。 只要我在调试器中点击该代码并尝试跳过它,该应用程序退出就不会提供其他信息。我没有打到捕获的声明。该应用程序退出。我真的很困惑。这看起来非常简单。我错过了一些傻事吗? 任何帮助表示赞赏。 感谢
答案 0 :(得分:0)
首先 - 您不应该使用ApplicationData.Current
,因为只有非签名的.xap
(不是来自Marketplace)才能使用IsolatedStorageFile
。因此,发布后应用程序将崩溃。
相反 - 使用public async Task<bool> SaveSubscriptions(List<Show> subs)
{
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
try
{
string data = JsonConvert.SerializeObject(subs, Formatting.Indented);
Byte[] bytes = Encoding.UTF8.GetBytes(data);
using (IsolatedStorageFileStream stream = storage.CreateFile("Subscriptions\\subscriptions.json"))
{
stream.Seek(0, SeekOrigin.End);
await stream.WriteAsync(bytes, 0, bytes.Length);
}
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
return false;
}
return true;
}
。示例代码段:
{{1}}
答案 1 :(得分:0)
在我的应用程序关闭之前,我遇到了类似的问题,因为它有机会在停用的事件中将文件写入本地存储。我的原因是因为停用事件中的异步操作。
由于应用程序正在启动另一个主要执行工作的线程,它将获得异步操作并在任务完成时将控制权返回给主线程。然后主线程将继续关闭。解决此问题的方法是简单地创建一个同步操作,强制主线程等待操作完成(排除async / await语法)。
更好的方法以及我在我的应用中处理它的方法是在更新时异步保存列表,而不是等待在已停用的事件中执行此操作。这样您就不依赖于用于将数据核心保存到应用程序操作的已停用事件。