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