Search code examples
c#backgroundworker

Variable backgroundWorker parameter is always the same?


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.


Solution

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