ThreadStart avec paramètres

Comment démarrer un thread avec des paramètres en C#?

223
demandé sur 2-bits 2009-07-28 22:31:35

14 réponses

Oui:

Thread t = new Thread (new ParameterizedThreadStart(myMethod));
t.Start (myParameterObject);
142
répondu Erick 2015-03-16 09:24:05

L'une des 2 surcharges du constructeur de Thread prend un délégué ParameterizedThreadStart qui vous permet de passer un seul paramètre à la méthode start. Malheureusement, il ne permet qu'un seul paramètre, et il le fait d'une façon dangereuse car elle passe comme objet. Je trouve qu'il est beaucoup plus facile d'utiliser une expression lambda pour capturer les paramètres pertinents et les transmettre de manière fortement typée.

Essayez ce qui suit

public Thread StartTheThread(SomeType param1, SomeOtherType param2) {
  var t = new Thread(() => RealStart(param1, param2));
  t.Start();
  return t;
}

private static void RealStart(SomeType param1, SomeOtherType param2) {
  ...
}
424
répondu JaredPar 2009-07-28 18:34:45

Vous pouvez utiliser des expressions lambda

private void MyMethod(string param1,int param2)
{
  //do stuff
}
Thread myNewThread = new Thread(() => MyMethod("param1",5));
myNewThread.Start();

C'est jusqu'à présent la meilleure réponse que j'ai pu trouver, c'est rapide et facile.

104
répondu Georgi-it 2013-03-18 16:41:40
Thread thread = new Thread(Work);
thread.Start(Parameter);

private void Work(object param)
{
    string Parameter = (string)param;
}

Le type de paramètre doit être un objet.

Modifier:

Bien que cette réponse ne soit pas incorrecte, je recommande contre cette approche. L'utilisation d'une expression lambda est beaucoup plus facile à lire et ne nécessite pas de conversion de type. Voir ici: https://stackoverflow.com/a/1195915/52551

33
répondu Spencer Ruport 2017-05-23 11:55:03
class Program
{
    static void Main(string[] args)
    {
        Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod));

        t.Start("My Parameter");
    }

    static void ThreadMethod(object parameter)
    {
        // parameter equals to "My Parameter"
    }
}
29
répondu huseyint 2009-07-28 18:35:18

Moyen Simple en utilisant lambda comme ça..

Thread t = new Thread(() => DoSomething("param1", "param2"));
t.Start();

OU, vous pourriez même delegate utiliser ThreadStart comme si...

ThreadStart ts = delegate
{
     bool moreWork = DoWork("param1", "param2", "param3");
     if (moreWork) 
     {
          DoMoreWork("param1", "param2");
     }
};
new Thread(ts).Start();
18
répondu Master Mick 2015-03-18 21:42:55
6
répondu Justin Niessner 2009-07-28 18:35:22
6
répondu Thomas 2009-07-28 18:35:39

J'avais un problème dans le paramètre passé. J'ai passé un entier d'une boucle for à la fonction et l'ai affiché, mais il a toujours donné des résultats différents. comme (1,2,2,3) (1,2,3,3) (1,1,2,3), etc ParametrizedThreadStart délégué.

Ce code simple a fonctionné comme un charme

Thread thread = new Thread(Work);
thread.Start(Parameter);

private void Work(object param) 
{
 string Parameter = (string)param; 
}
5
répondu user3805007 2014-07-04 09:58:56

Le ParameterizedThreadStart prend un paramètre. Vous pouvez l'utiliser pour envoyer un paramètre, ou une classe personnalisée contenant plusieurs propriétés.

Une autre méthode consiste à placer la méthode que vous souhaitez démarrer en tant que membre d'instance dans une classe avec les propriétés des paramètres que vous souhaitez définir. Créez une instance de la classe, définissez les propriétés et démarrez le thread en spécifiant l'instance et la méthode, et la méthode peut accéder aux propriétés.

4
répondu Guffa 2009-07-28 18:36:25

Vous pouvez utiliser un délégué ParametrizedThreadStart :

string parameter = "Hello world!";
Thread t = new Thread(new ParameterizedThreadStart(MyMethod));
t.Start(parameter);
3
répondu CMS 2009-07-28 18:36:02

Vous pouvez utiliser le BackgroundWorker RunWorkerAsync méthode et passer votre valeur.

3
répondu SwDevMan81 2009-07-28 18:41:36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {

            int x = 10;
            Thread t1 =new Thread(new ParameterizedThreadStart(order1));
            t1.IsBackground = true;//i can stope 
            t1.Start(x);

            Thread t2=new Thread(order2);
            t2.Priority = ThreadPriority.Highest;
            t2.Start();

            Console.ReadKey();
        }//Main

        static void  order1(object args)
        {
            int x = (int)args;


                for (int i = 0; i < x; i++)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(i.ToString() + " ");
            }
        }

        static void order2()
        {
            for (int i = 100; i > 0; i--)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write(i.ToString() + " ");
            }
        }`enter code here`
    }
}
1
répondu Mohammed Hassen Ismaile 2018-05-07 11:05:20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {

            int x = 10;
            Thread t1 =new Thread(new ParameterizedThreadStart(order1));
            t1.Start(x);

            Thread t2=new Thread(order2);
            t2.Priority = ThreadPriority.Highest;
            t2.Start();

            Console.ReadKey();
        }//Main

        static void  order1(object args)
        {
            int x = (int)args;


            for (int i = 0; i < x; i++)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write(i.ToString() + " ");
            }
        }

        static void order2()
        {
            for (int i = 100; i > 0; i--)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write(i.ToString() + " ");
            }
        }
    }
}
0
répondu Mohammed Hassen Ismaile 2018-05-07 10:58:14