Cuando alguien está desarrollando aplicaciones de escritorio, las cuales cada vez son menores ya que la mayoría de aplicaciones que se desarrollan hoy en día son Web, a menudo se encuentra con que un algoritmo tarda un poco más de la cuenta, con el resultado de que bloquea el proceso y por una parte no te deja hacer nada más con la aplicación, mientras que por otro lado parece que se haya quedado colgada, cosa que puede dar problemas porque el usuario cierre la aplicación, mate el proceso o cualquier otra acción similar. Por ello siempre se recomienda el uso de hilos o threads.
Como hacía bastante tiempo que no desarrollaba aplicaciones de escritorio el tema de los threads no lo tenía muy fresco, por lo que tuve que buscar algo de información para pequeños detalles que no recordaba. Los resultados los encontré en diferentes sitios, por eso me animé a reunirlos todos en este post, por si le pudiera servir a alguien de ayuda en un futuro.
Crear y lanzar un nuevo thread es fácil:
public class Simple { public static int Main() { Console.WriteLine("Thread Start/Stop/Join Sample"); // Create the thread object, passing in the Alpha.Beta method // via a ThreadStart delegate. This does not start the thread. Thread oThread = new Thread(new ThreadStart(this.Beta)); // Start the thread oThread.Start(); // Spin for a while waiting for the started thread to become // alive: while (!oThread.IsAlive); // Put the Main thread to sleep for 1 millisecond to allow oThread // to do some work: Thread.Sleep(1); // Request that oThread be stopped oThread.Abort(); // Wait until oThread finishes. Join also has overloads // that take a millisecond interval or a TimeSpan object. oThread.Join(); Console.WriteLine(); Console.WriteLine("Alpha.Beta has finished"); try { Console.WriteLine("Try to restart the Alpha.Beta thread"); oThread.Start(); } catch (ThreadStateException) { Console.Write("ThreadStateException trying to restart Alpha.Beta. "); Console.WriteLine("Expected since aborted threads cannot be restarted."); } return 0; } }
En el código anterior tenéis, además, formas de pausar o detener un hilo.
Al crear el hilo hemos puesto this.Beta porque el método al que llamamos está en nuestra clase. Si el método al que queremos llamar se encontrara en otra clase deberíamos poner su nombre primero:
Thread oThread = new Thread(new ThreadStart(Classname.Beta));
Bueno, hasta aquí todo sencillo. Ahora toca saber cómo pasarle parámetros al método al que llamamos. Olvidaos de ParameterizedThreadStart, con esta forma podréis pasarle múltiples parámetros:
string filename = ... Thread thread = new Thread(() => download(filename));
thread.Start();
Y de momento es todo por hoy. En un próximo artículo explicaré cómo poder acceder a esos objetos que quedan bloqueados por el hilo principal y nos traen de cabeza.