32 votes

Alternative à BackgroundWorker qui accepte plus d'un argument?

L'objet BackgroundWorker nous permet de transmettre un seul argument au DoWorkEventHandler.

 // setup/init:
BackgroundWorker endCallWorker = new BackgroundWorker();
endCallWorker.DoWork += new DoWorkEventHandler(EndCallWorker_DoWork);
...
endCallWorker.RunWorkerAsync(userName);

// the handler:
private void EndCallWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string userName = e.Argument as string;
    ...
}
 

Pour passer plusieurs arguments, je dois les envelopper dans un objet, comme ce pauvre tableau de chaînes:

 // setup/init:

BackgroundWorker startCallWorker = new BackgroundWorker();
startCallWorker.DoWork += new DoWorkEventHandler(StartCallWorker_DoWork);
...
startCallWorker.RunWorkerAsync(new string[]{userName, targetNumber});


// the handler:
private void StartCallWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string[] args = e.Argument as string[];
    string userName = args[0];
    string targetNumber = args[1];
}
 

Existe-t-il un autre objet ou modèle qui nous permet de transmettre plusieurs arguments avec soin ou, idéalement, d'écrire notre propre signature?

45voto

Ben M Points 14458

Vous pouvez utiliser un dispositif de fermeture (Lambda):

backgroundWorker.DoWork += (s, e) => MyWorkMethod(userName, targetNumber);

Ou avec des délégué (méthode anonyme) syntaxe:

backgroundWorker.DoWork += 
    delegate(object sender, DoWorkEventArgs e)
    {
        MyWorkMethod(userName, targetNumber);
    };

12voto

Vijay Patel Points 5696

Quel est le problème avec l'aide d'un tapé objet?

internal class UserArgs
{
    internal string UserName { get; set; }
    internal string TargetNumber { get; set; }
}

var args = new UserArgs() {UserName="Me", TargetNumber="123" };
startCallWorker.RunWorkerAsync(args);

4voto

Peter Long Points 2112

au lieu de tapé un objet. C# 4.0 nous offre n-uplet. Nous pourrions utiliser un tuple d'avoir plusieurs arguments. Il n'est pas nécessaire de déclarer une nouvelle classe.

3voto

McAden Points 7657

L'objet peut être une liste ou un tableau ou quelque chose du genre. Faites votre objet un conteneur de quelque sorte, alors coulé dans le BackgroundWorker. Vous devez vous assurer que vous êtes en passant toujours dans le même type de bien.

2voto

280Z28 Points 49515

Peut-être passer à une fonction lambda que votre objet? Alors vous souhaitez appeler dans la DoWork gestionnaire.

endCallWorker.RunWorkerAsync(new Action( () => DelegatedCallTarget(userName, targetNumber) ));

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