Fiquei curioso para saber como podemos passar parametros para Threads, ou seja, quando definimos um método de uma determinada classe que nossa Thread vai executar quando a mesma for iniciada. Atualmente não se tem muitos recursos para fazer isso e para conseguirmos suprir essa necessidade definimos o construtor da classe para receber o parametro que desejamos passar para que o método o utilize. Em código, fica mais ou menos como:
class MinhaApp
{
[STAThread]
static void Main(string[] args)
{
Teste t = new Teste(“Meu Parametro”);
Thread tr = new Thread(new ThreadStart(t.Escreve));
tr.Start();
}
}
public class Teste{
private string _param;
public Teste(string param){
this._param = param;
}
public void Escreve(){
Console.WriteLine(this._param);
}
}
Como podemos ver, a classe “Teste” recebe em seu construtor o(s) parametro(s) que vamos utilizar dentro do método “Escreve” e, quando o método for executado, teremos a certeza que os parametros estarão disponíveis para a utilização.
Andei analisando e, na versão 2.0 do .NET Framework temos um novo delegate do tipo ParameterizedThreadStart, que recebe um parametro do tipo Object e, para o ideal funcionamento deste, o método Start da classe Thread agora tem um overload, que recebe o parametro do tipo Object que será passado para o delegate. Em conjunto com os métodos anonimos, o código fica bastante elegante:
class Program
{
static void Main(string[] args)
{
ParameterizedThreadStart pts = new ParameterizedThreadStart(delegate(object o)
{
Console.WriteLine(o.ToString());
});
Thread t = new Thread(pts);
t.Start(“Meu Parametro”);
}
}
Muito bom. Estou automatizando um serviço de deploy. Esta dica de passar parametros foi fundamental.
Boas Charles,
Como o parâmetro é um objeto, você pode passar qualquer tipo.
Apenas faça o casting dentro do método para este tipo (com várias propriedades) e consuma como desejar.