¿Cómo pasar parámetros al Thread.ThreadStart()método en C #?
Supongamos que tengo un método llamado 'descargar'
public void download(string filename)
{
// download code
}
Ahora he creado un hilo en el método principal:
Thread thread = new Thread(new ThreadStart(download(filename));
Tipo de método de error esperado.
¿Cómo puedo pasar parámetros a ThreadStartcon el método de destino con parámetros?
c#
.net
multithreading
Swapnil Gupta
fuente
fuente

Respuestas:
Lo más simple es solo
La (s) ventaja (s) de esto (más
ParameterizedThreadStart) es que puede pasar múltiples parámetros y obtener una verificación en tiempo de compilación sin necesidad de emitirobjecttodo el tiempo.fuente
new Thread(delegate() { download(filename); });Mira este ejemplo:
Primero está creando un hilo pasando el método delegado al trabajador y luego lo inicia con un método Thread.Start que toma su objeto como parámetro.
Entonces, en su caso, debe usarlo así:
Pero su método de 'descarga' todavía necesita tomar un objeto , no una cadena como parámetro. Puedes convertirlo en cadena en el cuerpo de tu método.
fuente
Desea utilizar el
ParameterizedThreadStartdelegado para métodos de subprocesos que toman parámetros. (O ninguno en realidad, y dejar que elThreadconstructor infiera).Ejemplo de uso:
fuente
También te podría
delegategustar así ...fuente
En adicional
fuente
Puede encapsular la función de subproceso (descarga) y los parámetros necesarios (nombre de archivo) en una clase y utilizar el delegado ThreadStart para ejecutar la función de subproceso.
fuente
Te recomendaría tener otra clase llamada File.
Y en su código de creación de hilo, crea una instancia de un nuevo archivo:
fuente
Qué tal esto: (¿o está bien usarlo así?)
fuente
De acuerdo a tu pregunta ...
... y el error que encontró, tendría que corregir su código de
a
Sin embargo, la pregunta es más compleja como parece al principio.
La
Threadclase actualmente (4.7.2) proporciona varios constructores y unStartmétodo con sobrecargas.Estos constructores relevantes para esta pregunta son:
y
que o bien toman un
ThreadStartdelegado o unParameterizedThreadStartdelegado.Los delegados correspondientes se ven así:
Como se puede ver, el constructor correcto para usar parece ser el que toma un
ParameterizedThreadStartdelegado para que el hilo pueda iniciar algún método conforme a la firma especificada del delegado.Un ejemplo simple para instanciar la
Threadclase seríao solo
La firma del método correspondiente (llamado
Worken este ejemplo) se ve así:Lo que queda es comenzar el hilo. Esto se hace usando cualquiera
o
Si bien
Start()iniciaría el hilo y pasaríanullcomo datos al método,Start(...)se puede usar para pasar cualquier cosa alWorkmétodo del hilo.Sin embargo, hay un gran problema con este enfoque: todo lo que se pasa al
Workmétodo se convierte en un objeto. Eso significa que dentro delWorkmétodo tiene que volver al tipo original, como en el siguiente ejemplo:El casting es algo que normalmente no quieres hacer.
¿Qué pasa si alguien pasa algo más que no es una cadena? Como parece que esto no es posible al principio (porque es mi método, sé lo que hago o el método es privado, ¿cómo debería alguien ser capaz de pasarle algo? ) Es posible que termine exactamente con ese caso por varias razones . Como algunos casos pueden no ser un problema, otros sí lo son. En tales casos, probablemente terminará con uno
InvalidCastExceptionque probablemente no notará porque simplemente termina el hilo.Como solución, esperaría obtener un
ParameterizedThreadStartdelegado genérico comoParameterizedThreadStart<T>dóndeTsería el tipo de datos que desea pasar alWorkmétodo. Lamentablemente, algo como esto no existe (¿todavía?).Sin embargo, hay una solución sugerida para este problema. Implica crear una clase que contenga ambos, los datos que se pasarán al subproceso y el método que representa el método de trabajo de esta manera:
Con este enfoque, comenzaría el hilo de esta manera:
De esta manera, simplemente evitas dar vueltas y tienes una forma segura de proporcionar datos a un hilo ;-)
fuente
aquí está la manera perfecta ...
fuente