【问题标题】:How to update UI during long running operation [duplicate]如何在长时间运行操作期间更新 UI [重复]
【发布时间】:2020-04-07 19:25:04
【问题描述】:

我正在尝试做一些非常简单的事情,如下所示。

UpdateUI()
{
   DisableButtons()
   LongRunningOperation_UpdateLotsOfInformation()
   EnableButtons()
}

当我进行 UI 更新时,我想在 UI 加载时禁用按钮。但是,当我运行此代码时,DisableButtons() 的消息似乎直到所有 UpdateUI() 完成后才被处理。效果是按钮在加载期间(可能是 1 分钟)保持启用状态,然后当长时间运行加载完成时,按钮从启用快速闪烁到禁用。

在处理长时间运行的操作之前,如何确保按钮被禁用?

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

【问题讨论】:

  • 后台工作者、线程池、异步/等待、任务...
  • 您的问题并未具体说明您正在使用几个 GUI API 中的哪一个。 Winforms 和 WPF 是最常用的两种,因此请查看标记的重复项,以了解 Stack Overflow 上许多已回答的问题中的一小部分,这些问题可以解决您的问题。

标签: c# multithreading


【解决方案1】:

在处理长时间运行的操作之前,如何确保按钮被禁用?

  • 调用回 UI 线程,这将重绘所有挂起的操作

或更好

  • 为什么要在 UI 线程上执行长时间运行的操作?查找线程并在另一个线程上启动它们。

也可以:

  • 你说的是加载。如果所有加载都发生在异步方法中,那么问题不应该存在,IIRC,首先。

【讨论】:

  • 感谢您的快速回复。当您说“调用回 UI 线程,这将重绘所有待处理的操作”时,您能详细说明一下吗?我没有做过任何“调用”的东西,我不确定你的意思。
  • 在 WinForms 中,您应该能够使用 asyncawait,无论是本机(如果您的长时间运行的工作自然是异步的),或者通过等待 Task.Run 调用来完成工作在第二个线程上。如果您的长期工作将在其努力期间更新 UI,那么您将需要 Invoke 返回 UI 线程来执行此操作,或者将事情重构为多个等待块。查找Control.Invoke.InvokeRequired。抱歉,我认为这是特定于 WinForms 的。相同的 cmets 适用于 WPF
猜你喜欢
  • 2014-03-02
  • 2021-02-18
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
相关资源
最近更新 更多