0

我对使用 backgroundWorker 有点陌生,并且一直在网上研究如何使用它。从我得到的例子中,有些东西是没有意义的。在您的 DoWork 函数中,您从 0-100 或 1-10 运行一个循环,该循环基本上会告诉您的进度条您的进度是什么,并且在该循环内您可以完成所有艰苦的工作。那么如果你有一些工作要做,那就是一个循环,例如循环一个列表并将值打印到一个文件中?

这是我一直在玩的代码。

        void m_oWorkder_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Cancelled)
        {
            taskLabel.Text = "Task Cancelled";
        }

        else if (e.Error != null)
        {
            taskLabel.Text = "Error while performing background operation.";
        }
        else
        {
            taskLabel.Text = "Task Completed...";
        }

        startButton.Enabled = true;
        cancelButton.Enabled = false;


    }

    void m_oWorkder_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        taskLabel.Text = "Processing ... " + progressBar1.Value.ToString() + "%";
    }

    void m_oWorkder_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            someRandom();
            m_oWorker.ReportProgress(i);
            if (m_oWorker.CancellationPending)
            {
                e.Cancel = true;
                m_oWorker.ReportProgress(0);
                return;
            }
        }
        m_oWorker.ReportProgress(100);


    }

    private void startButton_Click(object sender, EventArgs e)
    {
        startButton.Enabled = false;
        cancelButton.Enabled = true;

        m_oWorker.RunWorkerAsync();
    }

    private void cancelButton_Click(object sender, EventArgs e)
    {
        if (m_oWorker.IsBusy)
        {
            m_oWorker.CancelAsync();
        }
    }

    private void someRandom()
    {


        int x = 0;
        while (x != 100)
        {
            x++;
            Console.WriteLine("Value of x = " + x);

        }

    }
4

2 回答 2

1

有不同的方法来处理这个问题。我更喜欢使用DoWorkEventArgs.Argument. 所以基本上将你的文件名列表传递给 BackGroundWorker:

 void m_oWorkder_DoWork(object sender, DoWorkEventArgs e)
  {
        var fileNames = (list<string>) e.Argument;

        foreach (var fileName in fileNames)
        {
          //write some stuff, do whatever you wish
          m_oWorker.ReportProgress(fileNames.IndexOf(fileName));
        }
   }
于 2013-07-10T21:16:47.407 回答
0

在您的 DoWork 函数中,您从 0-100 或 1-10 运行一个循环,该循环基本上会告诉您的进度条您的进度是什么,并且在该循环内您可以完成所有艰苦的工作。

这是一种常见的模式,但不是强制性的。

您不必在 DoWork 方法中有循环。您可以随心所欲地报告进度,并且您的 ProgressChanged 处理程序可以根据需要解释您的进度报告,不一定是百分比。

于 2013-07-10T21:10:41.720 回答