【问题标题】:how can i delay UI update until after calculations are finished?如何延迟 UI 更新直到计算完成?
【发布时间】:2016-02-24 04:45:21
【问题描述】:

我的 c# winforms 程序有一个选项卡控件,其中有几个选项卡显示列表视图、标签、按钮等。选项卡页在加载时不显示。简化后的代码如下:

public main()
{
    InitializeComponent();
    removeTabPages(); //removes all but one; deleting this line doesn't change anything
    main_tabcontrol.SelectedIndex = 0; //doesn't change anything no matter where i put it
    loadData();
    doSomeCalculations();
    addTabPages();
    main_tabcontrol.SelectedIndex = 2; //same issue if i pick any other tab here
}

private void Tabs_SelectedIndexChanged(object sender, EventArgs e)
{
    UpdateDataInTab();   
}

这会加载一些数据,进行一些计算,然后切换到标签页 2。我希望看到由 loadData() 和 doSomeCalculations() 函数处理的数据显示。相反,它显示默认值(几乎没有),直到我切换到另一个选项卡然后返回。这也验证了 Tabs_SelectedIndexChanged() 是否按预期工作。

我想了解为什么会发生这种情况以及如何使其按计划工作。

将 loadData() 和 doSomeCalculations() 作为异步任务运行并等待它们确实解决了这个问题,但它会带来很多其他问题,我想避免它(我不需要这个异步)。因为我的问题正好相反(我需要代码同步运行),所以这不应该是解决方案。

【问题讨论】:

  • 您是否使用任何类型的数据绑定?
  • @letsdance:听起来你的方法已经异步了;对吗?
  • 我没有使用数据绑定。这些方法不是异步的。
  • 实际上我正在使用某种数据绑定,但我认为它不相关,因为我只是将它用作以编程方式填充 DGV 的不同方式:DataTable dt = new DataTable();填充_dt(); DataGridView dgv; dgv.DataSource = dt;在启动时,应用程序将数据从文件加载到变量(类),然后以编程方式将其添加到控件中。

标签: c# winforms user-interface


【解决方案1】:

因为你在你的构造函数里有它,最好的地方就是放在负载上:

private void main_Load(object sender, EventArgs e)
{
    main_tabcontrol.SelectedIndex = 0; 
    loadData();
    doSomeCalculations();
    main_tabcontrol.SelectedIndex = 2; 
}

【讨论】:

  • 似乎 main_Load 根本没有触发。我将代码和 MessageBox.Show 移到那里。代码没有被执行,也没有显示框。
  • 在设计器中激活了加载事件,现在它可以工作了! thx =)
【解决方案2】:
  1. 除了构造函数中的实际初始化之外,不要做任何事情
  2. 使用 Loaded 事件实现初始工作
  3. 避免 UI 线程中的计算和其他 CPU 繁重的工作。使用背景线程来执行此操作。使用异步/等待

要使用加载事件,请双击表单上的空白区域或使用属性资源管理器并切换到事件。

【讨论】:

  • 我找不到 Loaded 事件。你能举个例子吗?计算不是 CPU 繁重的,因为我希望它们在其他任何事情发生之前完成,所以没有理由让它们异步。他们不会在很长一段时间内冻结 UI。
  • 添加了有关如何使用 Loaded 事件(WinForms 中的 Load 事件)的信息。再次,海事组织你在做什么是错误的。您假设没有人会修改这些方法,并且它们不可能消耗资源。您应该始终牢记,任何一段代码都应该是可重用的
  • 如果它们消耗资源,我仍然可以使它们异步。正如我在最初的帖子中所写的那样,我确实做到了(并保留了此代码以备日后需要)。但我遇到了其他麻烦,现在直接做会更有效率。这些其他问题可能与同一个问题有关(将其放入构造函数而不是加载),但目前没有理由使其异步。主要目标是让某些东西工作并完成,我以后仍然可以改进它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多