156 votes

Envoi d'arguments à un travailleur en arrière-plan?

Supposons que je veuille envoyer un paramètre int à un travailleur d'arrière-plan, comment cela peut-il être accompli?

 private void worker_DoWork(object sender, DoWorkEventArgs e) {

}
 

Je sais qu'il s'agit de worker.RunWorkerAsync () ;, je ne comprends pas comment définir dans worker_DoWork qu'il doit prendre un paramètre int.

247voto

Henk Holterman Points 153608

Vous commencez comme ça:

 int value = ...;
bgw1.RunWorkerAsync(value);  // argument: value,  the int will be boxed
 

et alors

 private void worker_DoWork(object sender, DoWorkEventArgs e) 
{
   int value = (int) e.Argument;   // the 'argument' parameter resurfaces here
   ...
}
 

106voto

Daniel Points 2452

Même s'il s'agit d'une question à laquelle il a déjà été répondu, je laisserais une autre option, à savoir que l'OMI est beaucoup plus facile à lire:

 BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (obj, e) => WorkerDoWork(value, text);
worker.RunWorkerAsync();
 

Et sur la méthode du gestionnaire:

 private void WorkerDoWork(int value, string text) {
    ...
}
 

52voto

Zain Ali Points 3813

Vous pouvez passer plusieurs arguments comme celui-ci.

 List<object> arguments = new List<object>();
                    arguments.Add(argument 1);
                    arguments.Add(argument 1);
                    arguments.Add(argument n);


                    backgroundWorker2.RunWorkerAsync(arguments);

private void worker_DoWork(object sender, DoWorkEventArgs e) {

  List<object> genericlist = e.Argument as List<object>;
  extract your multiple arguments from this list and cast them and use them. 

}
 

9voto

Dave Mateer Points 8717

Vous pouvez utiliser la propriété DoWorkEventArgs.Argument .

Un exemple complet (même en utilisant un argument int) peut être trouvé sur le site de Microsoft:

6voto

Jay Riggs Points 30783

Découvrez la propriété DoWorkEventArgs.Argument :

 ...
backgroundWorker1.RunWorkerAsync(yourInt);
...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // Do not access the form's BackgroundWorker reference directly.
    // Instead, use the reference provided by the sender parameter.
    BackgroundWorker bw = sender as BackgroundWorker;

    // Extract the argument.
    int arg = (int)e.Argument;

    // Start the time-consuming operation.
    e.Result = TimeConsumingOperation(bw, arg);

    // If the operation was canceled by the user, 
    // set the DoWorkEventArgs.Cancel property to true.
    if (bw.CancellationPending)
    {
        e.Cancel = true;
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X