c# - parametros - ¿Cómo pasar parámetros al método ThreadStart en Thread?
new thread c# (8)
¿Qué tal esto: (o está bien usar así?)
var test = "Hello";
new Thread(new ThreadStart(() =>
{
try
{
//Staff to do
Console.WriteLine(test);
}
catch (Exception ex)
{
throw;
}
})).Start();
¿Cómo pasar parámetros al método Thread.ThreadStart()
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 método de destino con parámetros?
Desea utilizar el delegado ParameterizedThreadStart
para los métodos de subproceso que toman parámetros. (O ninguno en realidad, y deje que el constructor Thread
infiera).
Ejemplo de uso:
var thread = new Thread(new ParameterizedThreadStart(download));
//var thread = new Thread(download); // equivalent
thread.Start(filename)
En adicional
Thread thread = new Thread(delegate() { download(i); });
thread.Start();
Esta es la manera perfecta ...
private void func_trd(String sender)
{
try
{
imgh.LoadImages_R_Randomiz(this, "01", groupBox, randomizerB.Value); // normal code
ThreadStart ts = delegate
{
ExecuteInForeground(sender);
};
Thread nt = new Thread(ts);
nt.IsBackground = true;
nt.Start();
}
catch (Exception)
{
}
}
private void ExecuteInForeground(string name)
{
//whatever ur function
MessageBox.Show(name);
}
Lo más simple es solo
string filename = ...
Thread thread = new Thread(() => download(filename));
thread.Start();
La (s) ventaja (es) de esto (sobre ParameterizedThreadStart
) es que puede pasar varios parámetros y obtener una verificación en tiempo de compilación sin necesidad de lanzar desde el object
todo el tiempo.
Mira este ejemplo:
public void RunWorker()
{
Thread newThread = new Thread(WorkerMethod);
newThread.Start(ParameterObject);
}
public void WorkerMethod(object parameterObject)
{
// do your job!
}
Primero está creando un subproceso pasando un método de delegado a trabajador y luego lo inicia con un método Thread.Start que toma su objeto como parámetro.
Así que en tu caso deberías usarlo así:
Thread thread = new Thread(download);
thread .Start(filename);
Pero su método de ''descarga'' todavía necesita tomar el objeto , no la cadena como parámetro. Puedes lanzarlo a cuerdas en tu cuerpo de método.
Puede encapsular la función de hilo (descargar) y los parámetros necesarios (nombre de archivo) en una clase y usar el delegado ThreadStart para ejecutar la función de hilo.
public class Download
{
string _filename;
Download(string filename)
{
_filename = filename;
}
public void download(string filename)
{
//download code
}
}
Download = new Download(filename);
Thread thread = new Thread(new ThreadStart(Download.download);
También podrías delegate
así ...
ThreadStart ts = delegate
{
bool moreWork = DoWork("param1", "param2", "param3");
if (moreWork)
{
DoMoreWork("param1", "param2");
}
};
new Thread(ts).Start();