我在我的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());
}
答案 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)
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);
}