Páginas

domingo, 10 de agosto de 2008

Como informações dentro do CallContext são passadas entre threads?

Estes dias tenho feito testes para uma prova de conceito de uma infra que estou desenvolvendo, para instrumentar chamadas de métodos.

Nela, a idéia é ir armazenando informações do contexto da chamada (parâmetros, tempo de chamada, usuário, máquina, etc), para se ter a rastreabilidade do que ocorre na execução dos sistemas.

Cheguei na conclusão que o uso da classe CallContext é uma boa para manter essas informações, pois o que é armazenado nela é trafegado entre threads e appdomains, durante o contexto da execução (lembrando que os objetos nela armazenados devem implementar ILogicalThreadAffinative, para que funcione como desejado).

Uma dúvida tinha ficado no ar... Como são mantidas as informações quando o contexto da execução passa para outras threads, por exemplo, via ThreadPool?

A resposta está na classe ExecutionContext. Cada thread possui uma instância desse objeto associada, e é nessa instância que são armazenadas informações como contexto de segurança e sincronização. E também é onde se coloca o CallContext.

Durante a instancia uma nova classe Thread, é pego o ExecutionContext da thread atual, copiado e passado para a nova thread. É dessa maneira que as informações passam de uma thread para a nova.

Vale lembrar que isso funciona apenas no .NET Framework 2.0 e superiores, pois no 1.x não funciona dessa maneira.

[]'s