saber - hilos en c# windows forms
Cómo crear un hilo? (5)
El siguiente método es lo que quiero que se haga en ese hilo:
public void Startup(int port,string path)
{
Run(path);
CRCCheck2();
CRCCheck1();
InitializeCodeCave((ushort)port);
}
Intenté lo que pude encontrar en Google, pero nada funcionó
public void Test(int port,string path)
{
Thread t = new Thread(Startup(port,path));
}
public void TestA(int port,string path)
{
Thread t = new Thread(Startup);
t.Start (port,path);
}
Ambos no compilan, ¿cómo hacer eso?
El método que desea ejecutar debe ser un delegado ThreadStart
. Consulte la documentación de Thread
en MSDN. Tenga en cuenta que puede ordenar el inicio de dos parámetros con un cierre. Algo como:
var t = new Thread(() => Startup(port, path));
Tenga en cuenta que es posible que desee volver a visitar su método de accesibilidad. Si veo una clase que comienza un hilo en su propio método público de esta manera, me sorprenderá un poco.
Las siguientes formas funcionan.
// The old way of using ParameterizedThreadStart. This requires a
// method which takes ONE object as the parameter so you need to
// encapsulate the parameters inside one object.
Thread t = new Thread(new ParameterizedThreadStart(StartupA));
t.Start(new MyThreadParams(path, port));
// You can also use an anonymous delegate to do this.
Thread t2 = new Thread(delegate()
{
StartupB(port, path);
});
t2.Start();
// Or lambda expressions if you are using C# 3.0
Thread t3 = new Thread(() => StartupB(port, path));
t3.Start();
Los métodos de inicio tienen la siguiente firma para estos ejemplos.
public void StartupA(object parameters);
public void StartupB(int port, string path);
Me gusta la Task Factory de System.Threading.Tasks. Puedes hacer algo como esto:
Task.Factory.StartNew(() =>
{
// Whatever code you want in your thread
});
Tenga en cuenta que la fábrica de tareas le brinda opciones de conveniencia adicionales como ContinueWith :
Task.Factory.StartNew(() => {}).ContinueWith((result) =>
{
// Whatever code should be executed after the newly started thread.
});
También tenga en cuenta que una tarea es un concepto ligeramente diferente de los hilos. Encajan perfectamente con las palabras clave async / await, mira here .
Su ejemplo falla porque los métodos Thread toman uno o cero argumentos. Para crear un hilo sin pasar argumentos, su código se ve así:
void Start()
{
// do stuff
}
void Test()
{
new Thread(new ThreadStart(Start)).Start();
}
Si desea pasar datos al hilo, debe encapsular sus datos en un solo objeto, ya sea una clase personalizada de su propio diseño, un objeto de diccionario u otra cosa. A continuación, debe utilizar el delegado ParameterizedThreadStart , así:
void Start(object data)
{
MyClass myData = (MyClass)myData;
// do stuff
}
void Test(MyClass data)
{
new Thread(new ParameterizedThreadStart(Start)).Start(data);
}
public class ThreadParameter
{
public int Port { get; set; }
public string Path { get; set; }
}
Thread t = new Thread(new ParameterizedThreadStart(Startup));
t.Start(new ThreadParameter() { Port = port, Path = path});
Cree un objeto con los objetos de puerto y ruta y páselo al método de inicio.