Passer les parameters à travers ParameterizedThreadStart

J’essaie de passer des parameters à travers les éléments suivants:

Thread thread = new Thread(new ParameterizedThreadStart(DoMethod)); 

Une idée de comment faire cela? J’apprécierais de l’aide

Lazyberezovsky a la bonne réponse. Je tiens à noter que techniquement, vous pouvez passer un nombre arbitraire d’arguments en utilisant l’expression lambda en raison de la capture de variable:

 var thread = new Thread( () => DoMethod(a, b, c)); thread.Start(); 

C’est un moyen pratique d’appeler des méthodes qui ne correspondent pas au délégué ThreadStart ou ParameterizedThreadStart , mais veillez à ce que vous puissiez facilement provoquer une course de données si vous modifiez les arguments dans le thread parent après les avoir transmis au code du thread enfant.

Utilisez la méthode Thread.Start surchargée, qui accepte les objects (vous pouvez transmettre votre type ou tableau personnalisé si vous avez besoin de plusieurs parameters):

 Foo parameter = // get parameter value Thread thread = new Thread(new ParameterizedThreadStart(DoMethod)); thread.Start(parameter); 

Et dans DoMethod suffit de lancer un argument sur votre type de paramètre:

 private void DoMethod(object obj) { Foo parameter = (Foo)obj; // ... } 

BTW dans .NET 4.0 et ci-dessus, vous pouvez utiliser des tâches (soyez également prudent avec les conditions de course):

 Task.Factory.StartNew(() => DoMethod(a, b, c)); 
 // Parameters to pass to ParameterizedThreadStart delegate // - in this example, it's an Int32 and a Ssortingng: class MyParams { public int A { get; set; } public ssortingng B { get; set; } // Constructor public MyParams(int someInt, ssortingng someSsortingng) { A = someInt; B = someSsortingng; } } class MainClass { MyParams ap = new MyParams(10, "Hello!"); Thread t = new Thread(new ParameterizedThreadStart(DoMethod)); t.Start(ap); // Pass parameters when starting the thread } 

Une autre façon d’archiver ce que vous voulez est de renvoyer un délégué dans votre fonction / méthode. Prenons l’exemple suivant:

 class App { public static void Main() { Thread t = new Thread(DoWork(a, b)); t.Start(); if (t.IsAlive) { t.IsBackground = true; } } private static ThreadStart DoWork(int a, int b) { return () => { /*DoWork*/ var c = a + b; }; } } 
 new Thread(() => { DoMethod(a, b, c); }).Start(); 

ou

 new Thread(() => DoMethod(a, b, c)).Start(); 

Au lieu de créer une classe à transmettre avec plusieurs parameters, comme @ user1958681 l’a fait, vous pouvez utiliser des types anonymes, puis utilisez simplement le typage dynamic pour extraire vos parameters.

 class MainClass { int A = 1; ssortingng B = "Test"; Thread ActionThread = new Thread(new ParameterizedThreadStart(DoWork)); ActionThread.Start(new { A, B}); } 

Puis dans DoWork

 private static void DoWork(object parameters) { dynamic d = parameters; int a = parameters.A; ssortingng b = parameters.B; }