如何在计算完成之前延迟UI更新?

时间:2015-11-21 20:01:01

标签: c# winforms user-interface

我的c#winforms程序有一个tabcontrol,其中有几个标签显示列表视图,标签,按钮等。加载时不会显示标签页。简化的代码如下所示:

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();   
}

这会加载一些数据,做一些计算然后切换到tabpage 2.我希望看到loadData()和doSomeCalculations()函数处理的数据显示出来。相反,它会显示默认值(大多数情况下没有),直到我切换到另一个选项卡然后再返回。这也验证了Tabs_SelectedIndexChanged()按预期工作。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

  1. 在构造函数
  2. 中的实际初始化旁边不要做任何事情
  3. 使用Loaded事件实现初始工作
  4. 避免在UI线程中进行计算和其他CPU繁重工作。使用backgroung线程执行此操作。使用async / await
  5. 要使用“加载事件”,请双击表单上的空白区域,或使用“属性资源管理器”并切换到事件。