在for循环中获取当前值
本文关键字:获取 for 循环 | 更新日期: 2023-09-27 18:29:54
我有一些嵌套的for循环,我想知道是否可以在处理数据时获得数据,所以我可以在屏幕上显示为加载栏。
这里有一个例子:
double currentData;
double endData = 50 * 50 * 50;
for(int i = 0; i < 50; i++)
{
for(int e = 0; e < 50; e++)
{
for(int a = 0; a < 50; a++)
{
currentData = a * e * i;
}
}
}
label1.Text = "Loading: " + Convert.ToString(100/endData * currentData) + "%.";
如果我没有错的话,for循环会使程序"冻结"直到完成,所以这可能就是为什么这段代码不能工作的原因。有什么建议吗?
感谢
如果您使用WinForms
,您可以使用后台工作程序来执行循环:
//declare in form
var bw = new BackgroundWorker();
//in constructor or load write this
bw.WorkerReportsProgress = true;
bw.DoWork += new DoWorkEventHandler(bwDoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bwProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwCompleted);
private void bwDoWork(object sender, DoWorkEventArgs e)
{
var worker = sender as BackgroundWorker;
for(int i = 0; i < 50; i++)
{
for(int e = 0; e < 50; e++)
{
for(int a : 0; a < 50; a++)
{
worker.ReportProgress(a * e * i);
}
}
}
}
private void bwProgressChanged(object sender, ProgressChangedEventArgs e)
{
var pp=e.ProgressPercentage; //now set the progress here
}
private void bwCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//set the progress to 100% etc.
}
然后,正如@paqogomez
所指出的,你需要调用工人来运行,可能会点击一些按钮等。
//may be in private void button_click(object sender, EventArgs e)
if (!bw.IsBusy)
{
bw.RunWorkerAsync();
}
你可以在这里和这里获得更多关于BackgroundWorker的信息。
您的假设是正确的,如果您想看到它发生变化,请尝试在for循环中更新label1.Text
。
如果我没有错的话,for循环会使程序"冻结"直到完成,所以这可能就是为什么这段代码不能工作的原因。
你是绝对正确的:如果你在UI线程上运行循环,那么在循环完成之前,UI不会更新,所以这种方法是不可行的。
有什么建议吗?
您需要在后台线程中完成这项工作,并在执行过程中更新progressBar
。您无法直接从不同的线程设置值,因此需要使用委托和特殊的调度机制。以下是一个答案,展示了如何在WPF和Windows窗体中实现这一点。