【发布时间】:2017-12-12 10:14:05
【问题描述】:
我有一个允许用户创建和修改文本文档的 UWP 应用。我很难让保存机制与应用挂起/恢复生命周期一起工作。
这是我所拥有的:
- 所有磁盘访问都在单独的后台线程上完成,以保持 UI 响应
- 该后台线程还序列化所有磁盘访问,以确保始终只发生一次读取或写入操作
- 在保存文档之前和之后,UI 会更新以指示正在进行保存。这是通过
Dispatcher.RunAsync()在 UI 线程上安排的
应用暂停时:
- 在暂停时,我必须最后一次保存文档以确保所有更改都在磁盘上(应用程序在暂停时可能会终止)
- 所以我请求
ExtendedExecutionSession - 我在队列中安排了最后一次保存操作
- 然后我等待队列处理所有挂起的磁盘访问操作
- 最后,我将扩展执行会话标记为已完成
我的问题:
- 已安排好的保存操作完成其磁盘访问,然后尝试通过
Dispatcher.RunAsync()更新主线程上的 UI。后台队列等待此任务完成,但它永远不会完成,因为到那时,UI 线程已经停止。
→ 所以我的最终保存操作永远不会执行,因为后台队列一直在等待更新 UI。
这是流程图:
出现的几个问题:
- 当应用程序暂停时,UI 线程究竟何时停止?只有当它空闲或“介于两者之间”时? IE。如果我通过
Dispatcher.RunAsync()安排了一个区块,这至少会完成还是“冻结”? - 有没有办法让我检查当前窗口的 UI 线程是否已经停止,以便我知道我不能再在后台文件访问线程中访问它?
- 应用暂停时,哪些线程被停止,何时停止?
- 当应用暂停时,我的后台文件访问线程是否也有被停止的风险?
总结问题:
当应用程序暂停时,我必须确保等待后台线程上可能挂起的磁盘访问完成,然后再最终保存文档一次,以防我的应用程序稍后终止。
【问题讨论】:
标签: c# multithreading uwp windows-10-universal suspend