2

当应用程序关闭/停用时,我正在尝试保存应用程序数据。在 WP8 中我使用了 StorageFile,它只支持 Async 方法。

问题是(正如我在阅读本文时怀疑并确认的那样),简单地说,操作系统生命周期事件和异步方法不能很好地混合在一起。所以,这不起作用(即使没有异步/等待)

private async void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
     var dataSvc = SimpleIoc.Default.GetInstance<ICachedDataService>();
     await dataSvc.StoreCachedDataAsync();
}

该文章提出了两种解决方法,但似乎都不理想:

  1. 使用不同的API,例如IsolatedStorage 而不是StorageFolder/File,它支持同步操作。
  2. 即用即存与最终保存

我对(2)的问题是,即使我尽快启动它,它仍然不能保证它有时间保存。

我对 (1) 的问题是……嗯……我正在使用 ServiceLocator/IoC 模式(我永远不记得哪个模式是什么),所以这迫使我在 的接口中引入同步操作ICachedDataProvider

还有其他方法吗?是否可以将 Async 方法转换为同步方法以增加代码重用?

4

3 回答 3

2

是否可以将 Async 方法转换为同步方法以增加代码重用?

抱歉不行。您可以采取多种方法来包装这些方法,但它们都不是万无一失的。此博客条目描述了各种方法。在你的情况下,我建议卸载到另一个线程;这是最容易工作的,但只有在ICachedDataProvider线程安全的情况下才能工作。

于 2013-08-03T15:56:02.867 回答
1

我发现了一些似乎可行的方法,但我将让这个问题搁置一段时间以等待反馈或其他解决方案。

我将 Application_Closing 和 Application_Deactivated 修改为以下内容(基于此 SO question

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
     var dataSvc = SimpleIoc.Default.GetInstance<ICachedDataService>();
     var task = Task.Run(async () => { await dataSvc.StoreCachedDataAsync(); });
     task.Wait();
}
于 2013-08-03T15:59:29.527 回答
0

并感谢您的引用。如您所见,可以选择包装/启动任务并尝试同步等待其完成。

但是……这充其量只是权宜之计。一旦启动关闭或停用操作,没有什么可以阻止它的发生,也没有什么可以打败开始的“死亡时钟”。时期。值得注意的是,这同样适用于 Windows 应用商店应用程序中的暂停。没有“购买更多时间”的机制——Windows 应用商店应用程序确实提供了“延期”,但正如我在帖子中提到的,这些仍然在上述“死亡时钟”的约束下运行。

我提出这个是因为你提到:

我对(2)的问题是,即使我尽快启动它,它仍然不能保证它有时间保存。

当我读到这个问题时,也许它表明应用程序开始“随时保存”操作,然后在保存运行时,发生生命周期事件(关闭/停用)......这些生命周期事件将是幸福地不知道正在进行的保存,该应用程序将放弃其执行,事情将简单地磨成不礼貌的停止。在这种情况下,保存操作可能包含一个同步标志,以指示该操作正在进行中,然后可以在生命周期事件中对其进行监视,但是(冒着打死马的风险)您仍然需要意识到整个“死亡时钟”的事情(加上事情开始变得复杂/令人费解。)

最终,如果您的应用程序发现自己的保存时间可能比允许的时间长,那么重新考虑游戏中的确切机制并查看是否有某种方法可以首先避免这种情况可能很重要。尽管有很多方法可以在这个过期时间内“玩弄”异步,但过期还是会发生。

于 2013-08-04T02:06:20.010 回答