- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 UWP 应用程序,允许用户创建和修改文本文档。我很难让保存机制与应用挂起/恢复生命周期一起工作。
这是我的:
Dispatcher.RunAsync()
应用暂停时:
ExtendedExecutionSession
我的问题:
Dispatcher.RunAsync()
更新主线程上的 UI。后台队列等待此任务完成,但它从未完成,因为到那时,UI 线程已经停止。→ 所以我最后的保存操作永远不会执行,因为后台队列卡在等待更新 UI。
这是一个流程图:
出现的几个问题:
Dispatcher.RunAsync()
安排一个 block ,这至少会完成或“卡住”吗?问题总结:
当应用程序暂停时,我必须确保等待后台线程上可能挂起的磁盘访问完成,然后再最终再次保存文档,以防我的应用程序稍后终止。
最佳答案
这听起来太熟悉了!
我从你的问题中了解到,保存操作以更新 UI 结束,但由于它在后台线程中运行,除非你使用 Dispatcher
安排它,否则它无法触及 UI。只是为了形象化,您的代码看起来像这样吗:
public async Task SaveAsync()
{
// .. save to disk ..
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
// update UI here
}
// Save Complete!
}
如果是这样,问题是 UI 更新是排队后台操作的一部分,如果 UI 更新或 Dispatcher
本身阻止了任何操作,则在您到达之前不会开始其他操作//Save Complete!
行,如果 Dispatcher
从不执行您的操作,则不会发生这种情况。
与其将保存操作与 UI 更新联系起来,不如尝试公开将触发 UI 更新的事件。例如:
public event EventHandler SaveStarted;
public event EventHandler SaveCompleted;
public async Task SaveAsync()
{
SaveStarted?.Invoke(this, EventArgs.Empty);
// .. save to disk ..
SaveCompleted?.Invoke(this, EventArgs.Empty);
}
您的 View 可以将处理程序附加到这些事件并显示/隐藏适当的视觉效果,而您的挂起处理程序可以安全地调用 SaveAsync()
方法而无需担心 UI。
当 View Unloaded
时,确保分离这些事件处理程序。引发这些事件时,您的保存操作不会阻塞队列。
更新 1
是的,您的事件处理程序必须使用 Dispatcher
在 UI 线程上运行:
public void OnSaveCompleted(object sender, EventArgs e)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
// update UI here...
}
}
因为处理程序被强制返回void
,所以它不会阻塞后台线程。
更新 2
听起来你们有一些紧密的耦合。您需要重新设计您的应用程序,以便您的文本文档逻辑位于一个单独的项目中。我总是在 .Net Standard 项目中编写代码,该项目强制退出所有 UI。该项目将不允许任何 UI 代码,从而使您的逻辑保持干净和解耦。
如果您的所有代码都位于 UWP 项目中,那么很容易开始包括 View 逻辑、XAML 控件,在您的情况下,您的应用程序部分中的 Dispatcher
与演示文稿。
在您的情况下,您需要弄清楚如何使您的文本文档逻辑成为文档状态的所有者,而不是 UI。 hasChanges
只能由拥有 SaveAsync()
的相同逻辑修改。如果在 UI 操作期间出现中断/阻塞/失败/等等,并且它从未成功地进入文本文档,那么它是一个不完整的操作,不应该成为文档的一部分,也不应该是文档的责任来担心关于它何时暂停并保存到磁盘。
如果 UWP 在这些操作之一期间出于任何原因终止了您的应用程序,那么它就消失了。您的下一个任务是弄清楚如何在应用程序再次唤醒时恢复此操作。
关于c# - 在暂停应用程序时访问 UI 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47770053/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!