如何将UI更新延迟到计算完成之后

本文关键字:计算 之后 迟到 延迟 UI 更新 | 更新日期: 2023-09-27 18:23:43

我的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()作为异步任务运行并等待它们确实解决了这个问题,但它会带来很多其他问题,我想避免它(我不需要这个异步)。由于我的问题正好相反(我需要代码来运行同步),所以无论如何,这不应该是解决方案。

如何将UI更新延迟到计算完成之后

这是因为你在构造函数中有它,所以最好把它放在负载上:

private void main_Load(object sender, EventArgs e)
{
    main_tabcontrol.SelectedIndex = 0; 
    loadData();
    doSomeCalculations();
    main_tabcontrol.SelectedIndex = 2; 
}
  1. 在构造函数中,除了实际初始化之外,永远不要做任何事情
  2. 使用Loaded事件执行初始工作
  3. 避免在UI线程中进行计算和其他CPU繁重的工作。使用背面螺纹执行此操作。使用async/await

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