-1

我有大量的数据和 Windows 窗体控件要从文件加载,当文件真的很大时,我必须使用进度条。

问题是,进度条可以工作,但在程序开始构建数据并将其加载到表单的那一刻,它会立即冻结。

那么,无论如何我可以让它工作吗?我将后台工作人员与进度条一起使用。

下面是一些代码:

private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
    try
    {
        listBox2.Items.Clear();
        listBox3.Items.Clear();
        dataGridView1.RowCount = 0;
        progressBar1.Visible = true;
        reading.Visible = true;
        backgroundWorker1.RunWorkerAsync();
        setLabels();
        progressBar1.Visible = false;
        reading.Visible = false;
    }
      }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        // Wait 100 milliseconds.
        Thread.Sleep(100);
        // Report progress.
        backgroundWorker1.ReportProgress(i);
    }
}

private void backgroundWorker1_ProgressChanged(object sender,
   ProgressChangedEventArgs e)
{
    // Change the value of the ProgressBar to the BackgroundWorker progress.
    progressBar1.Value = e.ProgressPercentage;
    // Set the text.
    reading.Text += " at " + e.ProgressPercentage.ToString() + "%";
}
4

2 回答 2

1

您应该在单独的线程上进行加载工作,并让您的主线程处理更新 UI。例如:

您可以使用您的文件启动工作人员以通过以下方式处理:

bgWorker.RunWorkerAsync(object);

然后连接一个 DoWork 方法,您可以在其中执行长时间运行的任务,这是您将向 UI 报告结果/进度条百分比的地方:

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{     
      object myObject = (object)e.Argument;
      bgWorker.ReportProgress(//YOUR FORMULA TO WORK OUT PERCENTAGE);
}

调用ReportProgress调用ProgressChanged事件,您可以使用以下方法从后台线程安全地更新 UI:

private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
        progressBar.Value = e.ProgressPercentage;
}
于 2012-07-25T10:32:09.193 回答
0

一定有什么东西阻止了你的 UI 线程更新。这样做

私人无效更新进度条(整数百分比)

    {
        if (ProgressBar.InvokeRequired)
        {
            updateProgressBarCallback cb = new updateProgressBarCallback(updateProgressBar);
            this.Invoke(cb, new object[] { percent });
        }
        else
        {
            ProgressBar.Value = percent;
            ProgressBar.Update();
            ProgressBar.Refresh();
            ProgressBar.Invalidate();
        }
    }
于 2013-10-04T08:52:53.987 回答