背景工作者 - 报告与字符串数组的进展

and*_*ree 9 .net c# backgroundworker

我需要在每个循环中从我的backgroundworker返回多个STRING值,所以我尝试使用ReportProgress第二个参数作为字符串数组.代码示例:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    string[] workerResult = new string[2];
    for (int i=0; i<someNumber; i++)
    {
        //do some heavy calculating
        workerResult[0] = "this string";
        workerResult[1] = "some other string";
        backgroundWorker1.ReportProgress(i, workerResult) // also tried workerResult[] and [2]
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    string[] results = (string[])e.UserState;

    MessageBox.Show(results[0]); // line of error
    MessageBox.Show(results[1]); // line of error
}
Run Code Online (Sandbox Code Playgroud)

它编译,但在运行时我尝试访问Userstate返回的字符串,我收到一个错误:"对象引用未设置为对象的实例."

对我来说,似乎在将数组参数传递给ProgressChanged委托时出错,或者在尝试设置结果数组值时使用ProgressChanged方法.

Han*_*ant 18

您的代码段无法重现问题.标准错误是调用ReportProgress()然后继续修改对象.事件处理程序运行需要一段时间,它将看到修改后的对象,而不是原始对象.您可以通过简单地创建一个新对象来避免这种情况,以便事件处理程序始终使用原始对象.像这样:

        //do some heavy calculating
        for (int i = 0; i < 2; ++i) {
            string[] workerResult = new string[2];
            workerResult[0] = "this string";
            workerResult[1] = "some other string";
            backgroundWorker1.ReportProgress(i, workerResult);
        }
Run Code Online (Sandbox Code Playgroud)

请注意数组创建语句如何在循环内移动.


dca*_*iro 9

当您实例化BackgroundWorker时,您必须将reportprogress设置为true:

worker = new BackgroundWorker { WorkerReportsProgress = true };
Run Code Online (Sandbox Code Playgroud)

在do work方法上你只需要这个:

 worker.ReportProgress(10, "Message");
Run Code Online (Sandbox Code Playgroud)

然后像这样来抓住进展:

private void WorkerProgressChanged(object sender, ProgressChangedEventArgs e) {
            if (e.UserState != null) {
                MessageBox.Show(e.UserState);
            }
        }
Run Code Online (Sandbox Code Playgroud)