Foreground threads e Background threads

O CLR considera que existem dois tipos de threads: foreground e background threads.

Foreground threads executam com uma prioridade elevada. Esse tipo de thread evita que a aplicação se encerre antes que tenham executado todo o seu trabalho.

Em contraponto, as background threads não são executadas com prioridade elevada. Background threads são finalizada imediatamente pelo CLR assim que todas as foreground threads de uma aplicação (leia managed assembly) encerram sua execução, sem lançar nenhuma exceção.

Desta forma, devemos usar foreground threads para executar tarefas que realmente devem alcançar a sua completude, como: escrita de dados em disco e envio de mensagens. E tarefas não críticas devem ficar associadas a background threads, como: execução de cálculos e consulta a serviços. Tarefas de menor criticidade ficam associadas a background tasks, pois são tarefas que podem ser reexecutadas e que quando paradas pela metade não causam impactos na aplicação ou perda de dados.

Uma background thread pode tornar-se uma foreground threads, assim como uma foreground thread pode tornar-se uma background thread.

O código abaixo demonstra a execução de uma background thread:

    class Program {
        static void Main(string[] args) {
            
            Thread newThread = new Thread(Execution);

            // Define the thread as a background thread. 
            newThread.IsBackground = true;

            newThread.Start();
        }

        static void Execution() {

            // Sleep during 10 seconds.
            Thread.Sleep(10000);

            Console.WriteLine("Finalized");
        }
    }

Note que ao executar o código acima a aplicação não espera pela execução do método “Execution” e logo se fecha, eliminando a execução da thread criada.

Se alterarmos o valor atribuído à propriedade “IsBackground” para FALSE, tornamos essa thread uma foreground thread. Assim garantimos a sua execução por completo. O código deve ficar desta forma:

    class Program {
        static void Main(string[] args) {
            
            Thread newThread = new Thread(Execution);

            // Define the thread as a foreground thread. 
            newThread.IsBackground = false;

            newThread.Start();
        }

        static void Execution() {

            // Sleep during 10 seconds.
            Thread.Sleep(10000);

            Console.WriteLine("Finalized");
        }
    }

O interessante deste exemplo é notar que um simples valor booleano pode mudar o funcionamento da sua aplicação e torna-la mais consistente.

Espero que seja útil.

Por
MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Visual C#

Referências:
CLR Via C# – 3rd Edition – Jeffrey Richter
http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground(v=vs.110).aspx
http://msdn.microsoft.com/en-us/library/h339syd0(v=vs.110).aspx

Anúncios

2 Responses to Foreground threads e Background threads

  1. Fala Fernando!
    Li o post em uma foreground thread já que são sempre bem interessantes.
    Como trabalho em uma instituição financeira se a galera de lá conhecesse melhor isto com certeza otimizaríamos muito o uso dos servidores.
    A unica desvantagem de threads em relação ao uso da TPL é a afinidade de processador e o código mais “imperativo” mas é um recurso deveras importante para aplicações que pretendem ter maior desempenho/disponibilidade.
    Abraços

  2. Pingback: Redimensão de imagens (C# + WFP + MVVM + Asynchronism + Comentários) | Fernando Henrique Ferreira

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: