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:
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);
}
}
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;
}
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.