【问题标题】:For loop bug in label [closed]标签中的循环错误[关闭]
【发布时间】:2015-09-06 02:21:53
【问题描述】:

嗯,很简单,创建一个窗体,在里面放一个按钮和一个标签,然后给按钮一个点击事件。

    private void button1_Click(object sender, EventArgs e)
    {
        int xa;
        int ya;
        for (xa = 647; xa < 982; xa++)

            for (ya = 262; ya < 598; ya++)
            {
                label1.Text = xa.ToString() + " " + ya.ToString();
            }
    }

当我单击按钮时,程序只停留了大约 20 秒。我该如何解决这个问题?

【问题讨论】:

  • 发生这种情况是因为您在 UI 线程上执行了很长的任务。查看BackgroundWorkerasyncStringBuilder 作为奖励。
  • 你现在的问题是“如果你运行的代码需要一些时间并且重复多次需要很长时间,如何解决它?”您可能想澄清您真正想要实现的目标......
  • 我没有看到我输入的按钮是一项很长的任务,它只是一个 300x300 的运行,但我想在这个程序中看到的是 y 在程序运行时立即增加,而不是在它完成时.
  • 更新文本框是长时间运行的任务,而不是循环
  • @Tranoze 你真的应该用你想看到的结果来更新你的问题......并运行一些基本的估计 - 即看到 300*300 不同的对,即使你可以在 60FPS 下区分每一帧将需要 300*300/60 = 1500 秒 ...

标签: c# winforms for-loop label


【解决方案1】:

您必须将其从 UI 线程中移除。试试这个:

private void button1_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(p => doit());            
}

private void doit()
{
    int xa;
    int ya;
    for (xa = 647; xa < 982; xa++)

        for (ya = 262; ya < 598; ya++)
        {
            this.Invoke(new Action(() => { label1.Text = xa.ToString() + " " + ya.ToString(); }));
        }
}

【讨论】:

  • 此更改所做的唯一事情是由于线程之间不断回调而使其变得更慢...不确定这会有多大帮助...
  • @AlexeiLevenkov - 确实比较慢。线程编组并不便宜。这取决于目标是什么。我假设 OP 在处理时试图处理无响应的 UI。
  • 工作线程上的小睡眠会给 UI 线程渲染的机会......显然不是最好的解决方案(应该使用计时器),但没关系。
  • 是的,它比较慢,但我的目标是让程序等待标签更新。
  • 这是在 UI 上下文中更新标签控件,看起来不像,如果是这样,那将是一个例外,或者这就是 this.Invoke 所做的,我不确定
猜你喜欢
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 2015-08-09
  • 2021-06-30
  • 2018-03-30
  • 1970-01-01
相关资源
最近更新 更多