valores valor tipo reciben que por paso pasar parametros parametro objetos metodos lista funciones ejemplos dinamicos como c# multithreading

valor - ¿Cómo pasar más de un parámetro a un hilo de C#?



pasar objetos como parametros en c# (6)

¿Cómo pasar más de un parámetro a un hilo de C #? Cualquier ejemplo será apreciado.


Es posible que las soluciones que ha dado tsocks no sean buenas para todas las situaciones, ya que especifica los parámetros en el momento de la creación del delegado ThreadStart, en lugar de en el momento de la ejecución. Esto podría provocar errores porque los parámetros podrían cambiar antes de la ejecución, lo que probablemente no sea lo que usted desea. Supongamos que necesita crear varios subprocesos en un bucle, cada uno con sus propios parámetros:

void CreateAndRunThreads() { List<ThreadStart> threadStartsList = new List<ThreadStart>(); //delegate creation for (int i = 0; i < 5; i++) { ThreadStart ts = delegate() { PrintInteger(i); }; threadStartsList.Add(ts); } //delegate execution (at this moment i=5 in the previous loop) foreach(ThreadStart ts in threadStartsList) { Thread t = new Thread(ts); t.Start(); } } private void PrintInteger(int i) { Debug.WriteLine("The integer value: "+i); }

La salida aquí es la siguiente:

The integer value: 5 The thread 0x17f0 has exited with code 0 (0x0). The integer value: 5 The integer value: 5 The thread 0x10f4 has exited with code 0 (0x0). The integer value: 5 The thread 0x1488 has exited with code 0 (0x0). The integer value: 5 The thread 0x684 has exited with code 0 (0x0).

Observe que todos los delegados imprimieron el valor 5, no de 0 a 4. Esto se debe a que los delegados de ThreadStart usan la variable "i", tal como está en el momento de la ejecución, no en el momento de la creación del delegado. Por lo tanto, cualquier cambio (i ++ en el bucle) del parámetro después del momento de la creación del delegado se reflejará en el valor del parámetro a medida que se ejecuta el delegado.

Una solución a este problema es usar ParameterizedThreadStart y una clase personalizada que agregue todos sus parámetros (si hay más). Con parametrizadoThreadStart, usted pasa los parámetros en el momento de la ejecución. Esto se vería algo así:

class CustomParameters { public int IntValue { get; set; } public string FriendlyMessage { get; set; } } private void CreateAndRunThreadsWithParams() { List<ParameterizedThreadStart> threadStartsList = new List<ParameterizedThreadStart>(); //delegate creation for (int i = 0; i < 5; i++) { ParameterizedThreadStart ts = delegate(object o) { PrintCustomParams((CustomParameters)o); }; threadStartsList.Add(ts); } //delegate execution for (int i=0;i<threadStartsList.Count;i++) { Thread t = new Thread(threadStartsList[i]); t.Start(new CustomParameters() { IntValue = i, FriendlyMessage = "Hello friend! Your integer value is:{0}"}); } } private void PrintCustomParams(CustomParameters customParameters) { Debug.WriteLine(string.Format(customParameters.FriendlyMessage, customParameters.IntValue)); }

La salida se muestra aquí:

Hello friend! Your integer value is:1 The thread 0x1510 has exited with code 0 (0x0). Hello friend! Your integer value is:0 The thread 0x13f4 has exited with code 0 (0x0). Hello friend! Your integer value is:2 The thread 0x157c has exited with code 0 (0x0). Hello friend! Your integer value is:3 The thread 0x14e4 has exited with code 0 (0x0). Hello friend! Your integer value is:4 The thread 0x1738 has exited with code 0 (0x0).

(El orden de ejecución no es determinista, es una carrera entre los hilos)


Para C # 3.0 puede evitar que la matriz de objetos feos pase con métodos anónimos:

void Run() { string param1 = "hello"; int param2 = 42; Thread thread = new Thread(delegate() { MyMethod(param1,param2); }); thread.Start(); } void MyMethod(string p,int i) { }


Supongamos que tienes un método:

void A(string a, int b) {}

Esto debería funcionar (.NET 2.0):

ThreadStart starter = delegate { A("word", 10); }; Thread thread = new Thread(starter); thread.Start();

Y lo siguiente (más corto) para versiones superiores:

ThreadStart starter = () => A("word", 10); Thread thread = new Thread(starter); //or just... //Thread thread = new Thread(() => A("word",10)); thread.start()


Una de las formas más sencillas de pasar un parámetro a un hilo como

Thread xmlThread =new Thread( ()=>WriteLog(LogTypes.Message, "Flag", "Module", "Location", "Text", "Stacktrace")); xmlThread.Start(); private object WriteLog(LogTypes logTypes, string p, string p_2, string p_3, string p_4, string p_5) { }


Puede utilizar una matriz para establecer el parámetro con varios valores ....

class Program { public static void Method1(object param) { object[] parameters = (object[])param; int param1 = (int)parameters[0]; string param2 = (string)parameters[1]; Console.WriteLine("Int : {0} /nString : {1}", param1, param2); } static void Main(string[] args) { Thread thread = new Thread(new ParameterizedThreadStart(Method1)); thread.Start(new object[] { 10, "String value" }); Console.Read(); } }


public void Start() { var t1 = new Thread((message) => { Console.WriteLine(message); }); //the parametirized threadstart accepts objects, it is not generic var t2 = new Thread(number => { var num = (int)number; Console.WriteLine(num++); }); var t3 = new Thread((vals)=> work(vals)); t1.Start(); t2.Start(); t3.Start(20); } public void work(params object[] vals) { }