318 votes

Comment passer des paramètres à la méthode ThreadStart dans un Thread ?

Comment passer des paramètres à Thread.ThreadStart() en C# ?

Supposons que j'ai une méthode appelée "download".

public void download(string filename)
{
    // download code
}

Maintenant j'ai créé un thread dans la méthode main :

Thread thread = new Thread(new ThreadStart(download(filename));

erreur type de méthode attendue.

Comment puis-je passer des paramètres à ThreadStart avec une méthode cible avec des paramètres ?

3 votes

Vérifiez ce article écrit par Jon Skeet La section sur les paramètres se trouve à la page suivante, mais l'article dans son ensemble est plutôt intéressant à lire.

753voto

Marc Gravell Points 482669

Le plus simple est juste

string filename = ...
Thread thread = new Thread(() => download(filename));
thread.Start();

Le(s) avantage(s) de ce système (par rapport à ParameterizedThreadStart ) est que vous pouvez passer plusieurs paramètres, et que vous bénéficiez d'une vérification au moment de la compilation sans avoir besoin d'effectuer un cast de object tout le temps.

18 votes

Je suis désolé pour le hors sujet mais que signifie l'opérateur '()' ? Je le vois parfois mais je n'ai pas le temps de vérifier.

28 votes

C'est une expression lambda sans arguments.

32 votes

@ukaszW.pl - ce que Noldorin a dit ;p en C# 2.0 une construction alternative (pour cet exemple) est new Thread(delegate() { download(filename); });

44voto

ŁukaszW.pl Points 4769

Regardez cet exemple :

public void RunWorker()
{
    Thread newThread = new Thread(WorkerMethod);
    newThread.Start(new Parameter());
}

public void WorkerMethod(object parameterObj)
{
    var parameter = (Parameter)parameterObj;
    // do your job!
}

Vous créez d'abord un thread en passant un délégué à la méthode worker, puis vous le démarrez avec la méthode Thread.Start qui prend votre objet comme paramètre.

Dans votre cas, vous devez donc l'utiliser comme suit :

    Thread thread = new Thread(download);
    thread.Start(filename);

Mais votre méthode de "téléchargement" doit encore prendre objet pas chaîne de caractères en tant que paramètre. Vous pouvez le convertir en chaîne de caractères dans le corps de votre méthode.

28voto

Noldorin Points 67794

Vous voulez utiliser le ParameterizedThreadStart délégué pour les méthodes de fil qui prennent des paramètres. (Ou pas du tout, en fait, et laisser la méthode Thread constructeur infer).

Exemple d'utilisation :

var thread = new Thread(new ParameterizedThreadStart(download));
//var thread = new Thread(download); // equivalent

thread.Start(filename)

8voto

TonyMontana Points 62

Vous pouvez également delegate comme ça...

ThreadStart ts = delegate
{
      bool moreWork = DoWork("param1", "param2", "param3");
      if (moreWork) 
      {
          DoMoreWork("param1", "param2");
      }
};
new Thread(ts).Start();

4voto

Metin Atalay Points 713

En complément

    Thread thread = new Thread(delegate() { download(i); });
    thread.Start();

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