hilo con múltiples parámetros

¿Alguien sabe cómo pasar múltiples parámetros en una rutina Thread.Start?

Pensé en extender la clase, pero la clase de hilo C # está sellada.

Aquí es donde creo que se vería el código:

... Thread standardTCPServerThread = new Thread(startSocketServerAsThread); standardServerThread.Start( orchestrator, initializeMemberBalance, arg, 60000); ... } static void startSocketServerAsThread(ServiceOrchestrator orchestrator, List memberBalances, string arg, int port) { startSocketServer(orchestrator, memberBalances, arg, port); } 

Por cierto, comienzo una serie de hilos con diferentes orquestadores, balances y puertos. Por favor, considere la seguridad hilo también.

Intente usar una expresión lambda para capturar los argumentos.

 Thread standardTCPServerThread = new Thread( unused => startSocketServerAsThread(initializeMemberBalance, arg, 60000) ); 

Debe envolverlos en un solo objeto.

Hacer una clase personalizada para pasar sus parámetros es una opción. También puede usar una matriz o lista de objetos, y establecer todos sus parámetros en eso.

Aquí hay un poco de código que usa el enfoque de matriz de objetos mencionado aquí un par de veces.

  ... string p1 = "Yada yada."; long p2 = 4715821396025; int p3 = 4096; object args = new object[3] { p1, p2, p3 }; Thread b1 = new Thread(new ParameterizedThreadStart(worker)); b1.Start(args); ... private void worker(object args) { Array argArray = new object[3]; argArray = (Array)args; string p1 = (string)argArray.GetValue(0); long p2 = (long)argArray.GetValue(1); int p3 = (int)argArray.GetValue(2); ... }> 

Use el patrón ‘Tarea’:

 public class MyTask { string _a; int _b; int _c; float _d; public event EventHandler Finished; public MyTask( string a, int b, int c, float d ) { _a = a; _b = b; _c = c; _d = d; } public void DoWork() { Thread t = new Thread(new ThreadStart(DoWorkCore)); t.Start(); } private void DoWorkCore() { // do some stuff OnFinished(); } protected virtual void OnFinished() { // raise finished in a threadsafe way } } 

.NET 2 conversión de JaredPar respuesta

 Thread standardTCPServerThread = new Thread(delegate (object unused) { startSocketServerAsThread(initializeMemberBalance, arg, 60000); }); 

No puedes. Cree un objeto que contenga los params que necesita, y pase lo es. En la función de hilo, devuelve el objeto a su tipo.

He estado leyendo el foro de ustedes para saber cómo hacerlo y lo hice de esa manera, podría ser útil para alguien. Paso argumentos en el constructor que crea para mí el hilo de trabajo en el que se ejecutará mi método – execute () .

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Windows.Forms; using System.IO; using System.Threading; namespace Haart_Trainer_App { class ProcessRunner { private string process = ""; private string args = ""; private ListBox output = null; private Thread t = null; public ProcessRunner(string process, string args, ref ListBox output) { this.process = process; this.args = args; this.output = output; t = new Thread(new ThreadStart(this.execute)); t.Start(); } private void execute() { Process proc = new Process(); proc.StartInfo.FileName = process; proc.StartInfo.Arguments = args; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardOutput = true; proc.Start(); string outmsg; try { StreamReader read = proc.StandardOutput; while ((outmsg = read.ReadLine()) != null) { lock (output) { output.Items.Add(outmsg); } } } catch (Exception e) { lock (output) { output.Items.Add(e.Message); } } proc.WaitForExit(); var exitCode = proc.ExitCode; proc.Close(); } } } 
 void RunFromHere() { string param1 = "hello"; int param2 = 42; Thread thread = new Thread(delegate() { MyParametrizedMethod(param1,param2); }); thread.Start(); } void MyParametrizedMethod(string p,int i) { // some code. } 

Puede tomar la matriz de objetos y pasarla en la secuencia. Pasar

 System.Threading.ParameterizedThreadStart(yourFunctionAddressWhichContailMultipleParameters) 

En el constructor de hilo.

 yourFunctionAddressWhichContailMultipleParameters(object[]) 

Ya has establecido todo el valor en objArray.

necesitas abcThread.Start(objectArray)

Puede curry la función “trabajo” con una expresión lambda:

 public void StartThread() { // ... Thread standardTCPServerThread = new Thread( () => standardServerThread.Start(/* whatever arguments */)); standardTCPServerThread.Start(); } 

Debe pasar un solo objeto, pero si es demasiado complicado definir su propio objeto para un solo uso, puede usar un Tuple .