2

我有一些嵌套的 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 循环会使程序“冻结”直到它完成,所以这可能就是这段代码不起作用的原因。有什么建议么?

谢谢

4

3 回答 3

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.
}

然后正如您所指出的那样,@paqogomez您需要调用工作人员来运行,可能是单击某些按钮等。

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

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

于 2013-09-02T23:15:11.050 回答
3

label1.Text您的假设是正确的,如果您想看到它发生变化,请尝试在您的 for 循环中进行更新。

于 2013-09-02T23:09:41.840 回答
1

如果我没记错的话,for循环会让程序“冻结”直到它完成,所以这可能就是这段代码不起作用的原因。

你是绝对正确的:如果你在 UI 线程上运行你的循环,UI 在循环完成之前不会更新,所以这种方法是不可行的。

有什么建议么?

您需要在后台线程中完成工作,并随时更新progressBar。您将无法直接从不同的线程设置值,因此您需要使用委托和特殊的调度机制。这是一个答案,显示了如何在 WPF 和 Windows Forms 中完成此操作

于 2013-09-02T23:12:37.360 回答