如何使用for循环中的实时结果更新GUI?

时间:2015-02-28 01:29:57

标签: c# for-loop

我在我的c#项目中使用for循环。

在某些情况下,我正在迭代超过500,000个值 - GUI直到循环结束才会响应。

我可以在for循环中更新GUI吗?

for (int i = 0; i < 100000; i++)
{
    double s1 = rnd.NextDouble();
    double s2 = rnd.NextDouble();
    w = Math.Sqrt(-2 * Math.Log(s1)) * Math.Cos(2 * Math.PI * s2);
    listBox1.Items.Add(w.ToString());
}

4 个答案:

答案 0 :(得分:3)

我这样做的最好方法是启动一个线程来填充一个带有文本的控件项,你需要从线程内部调用一个方法来填充列表框,这需要一个委托方法,

在您的班级中声明委托方法,

delegate void SetListBoxDelg(string value);

然后启动一个线程,开始填充列表框的过程,

Thread t  = new Thread(StartProc);
   t.Start();

这是您调用填充列表框的方法的线程代码,

public void StartProc()
{
  for (int i = 0; i < 100000; i++)
  {
    double s1 = rnd.NextDouble();
    double s2 = rnd.NextDouble();
    w = Math.Sqrt(-2 * Math.Log(s1)) * Math.Cos(2 * Math.PI * s2);
    SetListBox(w.ToString());
  }
}

这是从线程内部调用的方法,

private void SetListBox(string value)
{
  if (this.InvokeRequired)
  {
    SetListBoxDelg dlg = new SetListBoxDelg(this.SetListBox);
    this.Invoke(value);
    return;
  }
  listBox1.Items.Add(value);
}

答案 1 :(得分:0)

试试这个:

for (int i = 0; i < 100000; i++)
      {
            label.Text = i;
            double s1 = rnd.NextDouble();
            double s2 = rnd.NextDouble();
            w = Math.Sqrt(-2 * Math.Log(s1)) * Math.Cos(2 * Math.PI * s2);
            listBox1.Items.Add(w.ToString());

       }

将label.Text替换为您的标签名称。

答案 2 :(得分:0)

杰森休斯回答了上述问题。使用您正在显示计数器的控件的Refresh():

for (int i = 0; i < 100000; i++)
{
    labelIteration.Text = i.ToString();
    labelIteration.Refresh();

    double s1 = rnd.NextDouble();
    double s2 = rnd.NextDouble();
    w = Math.Sqrt(-2 * Math.Log(s1)) * Math.Cos(2 * Math.PI * s2);
}

答案 3 :(得分:-2)

如果是单线程应用程序,您可能会冻结GUI。尝试在循环中使用Application.DoEvents()方法。例如:

for (int i = 0; i < 100000; i++)
{
    labelToShow.Text = i.ToString(); // live update of information on the GUI
    labelToShow.Invalidate();
    Application.DoEvents();

    double s1 = rnd.NextDouble();
    double s2 = rnd.NextDouble();
    w = Math.Sqrt(-2 * Math.Log(s1)) * Math.Cos(2 * Math.PI * s2);
}