thread pasar parametros parameterizedthreadstart net hilos con asp arreglo administrar c# .net multithreading .net-4.5

c# - pasar - Se modificaron los parámetros del hilo



parameterizedthreadstart (2)

Debe tener cuidado al modificar accidentalmente variables capturadas como i después de iniciar el hilo, porque el i se comparte . La variable i refiere a la misma ubicación de memoria durante toda la vida útil del bucle. La solución es usar una variable temporal como esta:

for (int i = 0; i < _threadCount; i++) { var i1 = i; Thread thread = new Thread(() => WorkerThread(i1)); thread.Start(); _threads.Add(thread); }

Lea más sobre Closures aquí: La belleza de los Closures de ( Jon Skeet ) y las expresiones Lambda y las variables capturadas de ( Joseph Albahari ).

Al iniciar varios subprocesos, el parámetro id que estoy analizando a veces es incorrecto. Aquí está mi inicio:

for (int i = 0; i < _threadCount; i++) { Thread thread = new Thread(() => WorkerThread(i)); thread.Start(); _threads.Add(thread); }

Y mi función de hilo:

private void WorkerThread(int id) { Console.WriteLine("[{0}] Thread started {1}", DateTime.Now.ToLongTimeString(), id); }

La salida de este código es:

[19:10:54] Thread start 3 [19:10:54] Thread start 9 [19:10:54] Thread start 4 [19:10:54] Thread start 12 [19:10:54] Thread start 11 [19:10:54] Thread start 3 [19:10:54] Thread start 12 [19:10:54] Thread start 6 [19:10:54] Thread start 9 [19:10:54] Thread start 6 [19:10:54] Thread start 13 [19:10:54] Thread start 2 [19:10:54] Thread start 15 [19:10:54] Thread start 9 [19:10:54] Thread start 15

En mi opinión, este código debería crear cada hilo con una id única en lugar de duplicados como se ve arriba.

Información del compilador:

Objetivo de plataforma: x64

Marco de destino: .NET Framework 4.5


El problema es que la variable i refiere a la misma ubicación de memoria durante la vida útil del bucle. Por lo tanto, cada subproceso invoca una variable cuyo valor puede cambiar a medida que se ejecuta. La solución es usar una variable temporal int temp = i . como dijo @Salah Akbari .