I have the following code:
// 1.
public void RunSQL(QuerySetup querySetup)
{
//querySetup.Users is 10
for (int i = 1; i <= querySetup.Users; i++)
{
querySetup.CurrentUser = i;
var worker = new BackgroundWorker {WorkerReportsProgress = true};
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync(querySetup);
}
}
// 2.
void worker_DoWork(object sender, DoWorkEventArgs e)
{
var querySetup = e.Argument as QuerySetup;
// Doing stuff...
e.Result = querySetup.CurrentUser;
}
// 3.
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("User " + e.Result.ToString() + " is done.");
}
My goal is, that at the end I get:
User 1 is done
User 2 is done
...
User 10 is done
(not in that particular order)
But I only get 10x "User 10 is done".
But why? I need to somehow mark my worker process, so that I can identify it later.
Yes, there is only 1 querySetup object here and the main loop will continuously change currentUser.
All threads will share that single object.
for (int i = 1; i <= querySetup.Users; i++)
{
querySetup.CurrentUser = i;
...
worker.RunWorkerAsync(querySetup);
}
The basic solution (if you don't need other querySetup members)
for (int i = 1; i <= querySetup.Users; i++)
{
//querySetup.CurrentUser = i;
...
worker.RunWorkerAsync(i);
}