在for循环中获取当前值

Nic*_*man 2 c# for-loop loading winforms

我有几个嵌套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) + "%.";
Run Code Online (Sandbox Code Playgroud)

如果我没有错,for循环使程序"冻结"直到完成,这可能是为什么这段代码不起作用的原因.有什么建议?

谢谢

The*_*iot 5

好吧,如果你使用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.
}
Run Code Online (Sandbox Code Playgroud)

然后按照@paqogomez你所指示的那样,你需要调用工人来运行,可能会点击一些按钮等.

//may be in private void button_click(object sender, EventArgs e)
if (!bw.IsBusy)
{
    bw.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处此处获取有关BackgroundWorker的更多信息.

  • 你也需要一个RunWorkerAsync. (2认同)