Background worker - report progress with string array

后端 未结 3 1211
终归单人心
终归单人心 2020-12-16 20:16

I need to return multiple STRING values from my backgroundworker in each loop, so I tried to use ReportProgress second parameter as string array. Example of code:

         


        
相关标签:
3条回答
  • 2020-12-16 20:42

    when you instanciate your BackgroundWorker, you'll have to set reportprogress to true:

    worker = new BackgroundWorker { WorkerReportsProgress = true };
    

    On the do work method you'll just need this:

     worker.ReportProgress(10, "Message");
    

    Then something like this to catch the progress:

    private void WorkerProgressChanged(object sender, ProgressChangedEventArgs e) {
                if (e.UserState != null) {
                    MessageBox.Show(e.UserState);
                }
            }
    
    0 讨论(0)
  • 2020-12-16 20:42

    I've solved a similar issue by adding a new ProgressChanged event listener to your background worker and block passing to the next loop if ProgressChanged not fired:

    bool progressed;
    
    backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
    string[] workerResult = new string[2];
    for (int i = 0; i < 2; ++i) {
        progressed=true;
    
        workerResult[0] = "this string";
        workerResult[1] = "some other string";
        backgroundWorker1.ReportProgress(i, workerResult);
        while (progressed)
        {
           //you can add a thread sleep 
        }
    }
    
    
    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
         progressed = false;
    }
    
    0 讨论(0)
  • 2020-12-16 20:46

    Your code snippet is incapable of reproducing the problem. A standard mistake is to call ReportProgress() and then to continue modifying the object. It takes a while for the event handler to run, it will see the modified object, not the original. You avoid this by simply creating a new object so that the event handler always works with the original. Like this:

            //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);
            }
    

    Note how the array creation statement is moved inside the loop.

    0 讨论(0)
提交回复
热议问题