0

TL/DR:我们有一个 Windows 通用应用程序,它使用 StorageFile 类与本地存储的 JSON 数据进行交互。使用该应用一天后,用户收到 UnauthorizedAccessException 并且数据消失。

长版:我们有一个 Windows 通用应用程序,它从 API 检索数据并将该数据本地保存到我们应用程序的 ApplicationData.Current.LocalFolder 中的 JSON 文件,以便用户可以离线工作。数据通常在一天开始时检索,并在一天结束时发送回 API。当一条记录成功发送回 API 时,它会从本地 JSON 中删除。与 API 的整个同步过程是使用 UI 中的按钮手动触发的。此工作流程还限制了应用程序和 API 之间发送的数据量,并防止本地文件无休止地增长。

我们使用 StorageFile 类将数据加载到内存中的集合中,以读取 JSON 文件的内容并使用 Newtonsoft JsonConvert 对象将它们转换为我们的模型对象。所有这一切一直顺利进行了一段时间,直到最近,当用户开始报告数据正在消失时。查看应用程序的日志文件,我们看到一个一致的错误弹出:

'Exception when reading file "<filename>" from storage: System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at HQSTouch.Infrastructure.StorageManager.<ReadFromStorageAysnc>d__2.MoveNext()'

在读取文件或写入文件时,我们可能会看到此错误。至少从最终用户的角度来看,这些错误的不幸结果是数据消失了。这通常发生在用户一天大部分时间都在使用该应用程序之后,完成了他们对 15 条记录中的 10 条的工作。在我的测试中,我看到 JSON 文件的大小从 <50Kb 跃升至高达几百 Kb,这似乎并不过分。

现在,当数据消失时,它并没有全部消失。在文件访问错误之后,如果用户仍在处理一条记录,因此它在内存中,则该记录最终成为本地 JSON 文件中的唯一记录。将数据保存到本地文件时,我们将文件中的数据加载到集合中,合并到修改后的记录中,然后将其序列化并全部写回 JSON 文件,替换文件的内容。

任何帮助将不胜感激。谢谢。

编辑:虽然这可能类似于如何处理 StorageFile 操作的并发性中发布的问题?,我们对 async/await 操作非常谨慎,尤其是在与文件系统交互时。快速扫描代码堆栈显示我们的方法返回一个 Task 并处于等待状态。我觉得我们的情况与该线程中讨论的情况不同。特别是对于一个用户,这个问题在最新一轮 Windows 更新之后才开始发生。在 Windows 更新之前,他们已经使用该应用程序一段时间没有任何问题。那时我们的应用程序没有任何更新。

4

0 回答 0