【问题标题】:Update GUI components from Begininvoke从 Begininvoke 更新 GUI 组件
【发布时间】:2016-06-09 17:08:48
【问题描述】:

所以我有一个非常基本的 Windows 应用程序,我想从 1 数到 10000 并在标签中显示数字:

private void button1_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(() =>
        {
            for (int i = 0; i < 10000; i++)
            {
                BeginInvoke((MethodInvoker)delegate ()
                {
                    label3.Text = i.ToString();
                });
            }
        });

        thread.Start(); 
}

问题是标签文本没有更新,只显示最后一个循环计数器,即 9999。是否在 UI 线程上调用 BeginInvoke?为什么标签没有正确更新?

谢谢。

【问题讨论】:

  • 您希望数字在每次单击按钮时递增?
  • @LaneL 不,我想按一个按钮,看看数字上升到 10000
  • 使用后台工作人员...参考这里的详细信息 - msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx
  • @Sanket 我知道 Backgroundworker,我想知道为什么 Begininvoke 不起作用。
  • 您创建了一个消防水管漏洞。您正在以非常高的速度猛击 UI 线程。太快以至于无法保持标签更新,调用的优先级高于绘制,并且太快以至于你的眼睛看不到变化。您必须放慢速度,例如使用 Task.Delay(15)。

标签: c# user-interface begininvoke


【解决方案1】:

因为 BeginInvoke 是一个异步调用,所以您向文本框发送了太多更新,以至于它无法足够快地更新,当文本框开始绘制时,它已经计数到 10000!

您可以同步更新文本,即调用循环将暂停,直到文本框更新并完成,使用 Invoke 而不是 BeginInvoke。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多