Share via


Thread Pooling (C# e Visual Basic)

A pool de segmentos é uma coleção de segmentos que podem ser usados para executar várias tarefas em segundo plano. (Consulte Threading (C# e Visual Basic) para informações de plano de fundo.) Isso deixa o thread primário livre para executar outras tarefas de forma assíncrona.

Thread pools normalmente são empregados em programas servidores. Cada solicitação que chega é atribuída a uma thread do pool de threads, para que a solicitação pode ser processada de forma assíncrona, sem interromper a thread principal ou atrasar o processamento de solicitações subseqüentes.

Depois que a thread do pool concluir sua tarefa, ela retorna para a fila de threads em modo de espera, onde a thread pode ser reutilizada. Essa reutilização permite que os programas evitem o custo de criar uma nova thread cada tarefa.

Thread pools geralmente tem um número máximo de threads. Se todas as threads estiverem ocupadas, tarefas adicionais serão colocadas na fila até que elas possam ser atendidas a medida que as threads se tornarem disponíveis.

Você pode implementar seu próprio pool de threads, mas é mais fácil de usar o pool de segmentos fornecido pelo.NET Framework através do ThreadPool classe.

Com o pool de segmentos, você chamar o ThreadPool.QueueUserWorkItem o método com um delegado para o procedimento que você deseja executar, e Visual Basic ou C# cria o segmento e executa o procedimento.

Exemplo de Pool de Segmentos

Este exemplo mostra como você pode usar o pool de segmentos para iniciar várias tarefas.

Public Sub DoWork()
    ' Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf SomeLongTask))
    ' Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf AnotherLongTask))
End Sub
Private Sub SomeLongTask(ByVal state As Object)
    ' Insert code to perform a long task.
End Sub
Private Sub AnotherLongTask(ByVal state As Object)
    ' Insert code to perform another long task.
End Sub
public void DoWork()
{
    // Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(SomeLongTask));
    // Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(AnotherLongTask));
}

private void SomeLongTask(Object state)
{
    // Insert code to perform a long task.
}

private void AnotherLongTask(Object state)
{
    // Insert code to perform a long task.
}

Uma vantagem do pool de segmentos é que você pode passar argumentos em um objeto de estado para o procedimento de tarefas. Se o procedimento que você está chamando exigir mais de um argumento, você pode usar uma estrutura ou uma instância de uma classe com um tipo de dados Object.

Parâmetros do Pool de Segmentos e Valores de Retorno

Valores de retorno de um segmento de pool de segmentos não são simples. A forma padrão de retornar valores de uma chamada de função não é permitida porque procedimentos Sub são os únicos tipos de procedimentos que podem ser colocados na fila para um pool de segmentos. Uma maneira de você poder fornecer parâmetros e retornar valores é envolvendo os parâmetros, valores de retorno e métodos em uma classe wrapper como descrito em Parâmetros e valores de retorno for Multithreaded Procedures (C# e Visual Basic).

Uma maneira mais fácil de fornecer parâmetros e retornar valores é usar o estado ByVal opcional de variável de objeto do método QueueUserWorkItem. Se você usar essa variável para passar uma referência a uma instância de uma classe, os membros da instância podem ser modificados pelo segmento de pool de segmentos e usados como valores de retorno.

Inicialmente pode não ser óbvio que você possa modificar um objeto referenciado por uma variável que é passada por valor. Você pode fazer isso porque somente a referência de objeto é passada por valor. Quando você faz alterações em membros do objeto referenciados pela referência de objeto, as alterações são aplicadas à instância real da classe.

Estruturas não podem ser usadas para retornar valores dentro de objetos de estado. Como estruturas são tipos de valor, as alterações que o processo assíncrono faz não alteram os membros da estrutura original. Use estruturas para fornecer parâmetros quando valores retornados não forem necessários.

Consulte também

Tarefas

Como: Usar um Pool de threads (C# e Visual Basic)

Referência

Segmento de sincronização (C# e Visual Basic)

QueueUserWorkItem

System.Threading

ThreadPool

Conceitos

Threading (C# e Visual Basic)

Aplicativos multithread (C# e Visual Basic)

Outros recursos

COMO: Enviar um Item de trabalho para o Pool de segmentos usando o Visual C#