¿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 ThreadStart
con 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 emitirobject
todo 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
ParameterizedThreadStart
delegado para métodos de subprocesos que toman parámetros. (O ninguno en realidad, y dejar que elThread
constructor infiera).Ejemplo de uso:
fuente
También te podría
delegate
gustar 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
Thread
clase actualmente (4.7.2) proporciona varios constructores y unStart
método con sobrecargas.Estos constructores relevantes para esta pregunta son:
y
que o bien toman un
ThreadStart
delegado o unParameterizedThreadStart
delegado.Los delegados correspondientes se ven así:
Como se puede ver, el constructor correcto para usar parece ser el que toma un
ParameterizedThreadStart
delegado para que el hilo pueda iniciar algún método conforme a la firma especificada del delegado.Un ejemplo simple para instanciar la
Thread
clase seríao solo
La firma del método correspondiente (llamado
Work
en 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íanull
como datos al método,Start(...)
se puede usar para pasar cualquier cosa alWork
método del hilo.Sin embargo, hay un gran problema con este enfoque: todo lo que se pasa al
Work
método se convierte en un objeto. Eso significa que dentro delWork
mé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
InvalidCastException
que probablemente no notará porque simplemente termina el hilo.Como solución, esperaría obtener un
ParameterizedThreadStart
delegado genérico comoParameterizedThreadStart<T>
dóndeT
sería el tipo de datos que desea pasar alWork
mé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