20 de jan. de 2010

Relembrando: threads e dynamic

Calabi-Yau_art

Ontem eu precisei re-lembrar o conceito de threads. Um cliente me pediu para que o seu sistema enviasse um email, para um supervisor, quando algum pedido “especial” entrasse em seu sistema.

O problema foi a demora no envio de e-mail quando o pedido ia ser salvo.

Então eu resolvi colocar o processo de envio de e-mail em uma thread. Assim liberando o sistema para demais tarefas e interação com o usuário.

Vou exemplificar o que eu fiz: imagine um método para somar dois números que tem que ser rodado em uma thread. Eu fiz um método que recebe um object, que serão meus números a serem somados. Assim foi possivel disparar a thread usando o delegate ParameterizedThreadStart. Para passar os números eu passo um objeto anônimo. Acompanhe no código:

class Program
{
    private static int resultado = 0;

    static void Main(string[] args)
    {
        var a = 2;
        var b = 3;

        // -> Cria a Thread.
        var processo = new Thread(SomarNumeros);
        // -> Inicia a thread passando um objeto anonimo com os numeros para seu parametro.
        processo.Start(new { a, b });

        Console.ReadKey();
    }

    private static void SomarNumeros(object numeros)
    {
        // -> recupera os numeros via reflection.
        var primeiroNumero = (int) numeros.GetType().GetProperty("a").GetValue(numeros, null);
        var segundoNumero = (int)numeros.GetType().GetProperty("b").GetValue(numeros, null);
        resultado = primeiroNumero + segundoNumero;
    }
}

Uma última observação é que usando .NET 4 temos a possibilidade de usar dynamic para recuperar os valores animos, veja:

private static void SomarNumeros(dynamic numeros)
{
    // -> soma os numeros via dynamic.
    resultado = numeros.a + numeros.b;
}

Valews, até a próxima.

0 comentários: