Compartilhar via


Gerenciado e Threading no Microsoft Windows

Gerenciamento de todos os threads é feito por meio de Thread classe, incluindo os threads criados pelo common language runtime e aqueles criados fora o tempo de execução que insira o ambiente gerenciado para executar o código. O tempo de execução monitora todos os threads em seu processo nunca tiverem executado o código dentro do ambiente de execução gerenciado. Ele não controla qualquer outros segmentos. Segmentos podem inserir o ambiente de execução gerenciado por meio de interoperabilidade COM (porque o runtime expõe os objetos gerenciados como objetos COM o mundo não gerenciado), o COM DllGetClassObject() função e a invocação de plataforma.

Quando um thread não gerenciado insere o tempo de execução por meio de, por exemplo, um COM callable wrapper, o sistema verifica o armazenamento local de segmento dessa thread para procurar gerenciadas interna segmento objeto. Se for encontrado, o runtime já está ciente deste segmento. Se não encontrar um, no entanto, o runtime cria uma nova segmento de objeto e o instala no armazenamento local de segmento do thread.

No gerenciados de threading, Thread.GetHashCode é a identificação de estável thread gerenciado. Tempo de vida do seu segmento, ele será colide com o valor de outro segmento, independentemente do domínio do aplicativo do qual você obter esse valor.

Observação

Um sistema operacional ThreadId não tem nenhuma relação fixa para um segmento gerenciado, porque um host não gerenciado pode controlar a relação entre os threads gerenciados e não gerenciados.Especificamente, um host sofisticado pode usar a API de fibra para agendar muitos threads gerenciados contra o mesmo thread do sistema operacional ou mover um thread gerenciado entre threads do sistema operacional diferente.

Mapeamento de Threading do Win32 para Threading gerenciado

A tabela a seguir mapeia os elementos de threads do Win32 para seu equivalente em tempo de execução aproximado. Observe que esse mapeamento não representa funcionalidades idênticas. Por exemplo, TerminateThread não executar Finalmente cláusulas ou liberar recursos e não pode ser evitada. No entanto, Thread.Abort executa todo o código de reversão, recupera todos os recursos e pode ser negado usando ResetAbort. Certifique-se de ler a documentação atentamente antes de fazer suposições sobre a funcionalidade.

No Win32

No common language runtime

CreateThread

Combinação de de segmento e ThreadStart

TerminateThread

Thread.Abort

SuspendThread

Thread.Suspend

ResumeThread

Thread.Resume

Suspensão

Thread.Sleep

WaitForSingleObject no identificador de segmento

Thread.Join

ExitThread

Não há equivalente

GetCurrentThread

Thread.CurrentThread

SetThreadPriority

Thread.Priority

Não há equivalente

Thread.Name

Não há equivalente

Thread.IsBackground

Fechar para CoInitializeEx (OLE32.DLL)

Thread.ApartmentState

Threads gerenciados e Apartments COM

Um segmento gerenciado pode ser marcado para indicar que hospedará um apartamento single-threaded ou multithread. O GetApartmentState, SetApartmentState, e TrySetApartmentState métodos para a Thread classe retornar e atribuir o estado apartment de um segmento. Se o estado não tiver sido definido, GetApartmentState retorna ApartmentState.Unknown.

Observação

No.NET Framework versões 1.0 e 1.1, o ApartmentState propriedade é usada para obter e definir o estado de apartamento.

A propriedade pode ser definida somente quando o thread está na ThreadState.Unstarted estado; pode ser definido apenas uma vez para um segmento.

Se o estado de apartamento não for definido antes que o segmento é iniciado, o segmento é inicializado como um MTA (multithreaded apartment). O thread do finalizador e todos os threads controlados por ThreadPool são MTA.

Observação importanteImportante

Código de inicialização do aplicativo, a única maneira de controlar o estado do apartamento é aplicar o MTAThreadAttribute ou STAThreadAttribute para a entrada de ponto de procedimento.No.NET Framework versões 1.0 e 1.1, o ApartmentState propriedade pode ser definida como a primeira linha de código.Isso não é permitido o.NET Framework versão 2.0.

Os objetos gerenciados são expostos a COM se comportam como se eles tinham agregados de empacotamento de segmentação livre. Em outras palavras, eles podem ser chamados de qualquer apartment COM uma maneira de segmentação livre. Os únicos objetos gerenciados que não exibem este comportamento de segmentação livre são aqueles objetos que derivam de ServicedComponent.

No mundo gerenciado, não há nenhum suporte para o SynchronizationAttribute , a menos que você usar contextos e instâncias gerenciados vinculados a contexto. Se você estiver usando EnterpriseServices, e seu objeto deve derivar de ServicedComponent (que propriamente dito é derivado de ContextBoundObject).

Quando o código gerenciado chama objetos COM, sempre segue regras COM. Em outras palavras, ele chama por meio de proxies de apartment COM e wrappers de contexto de COM+ 1.0 como determinado pela OLE32.

Problemas de bloqueio

Se o segmento faz uma chamada não gerenciada no sistema operacional que bloqueou o segmento de código não gerenciado, o runtime não terão o controle dele para Thread.Interrupt ou Thread.Abort. No caso de Thread.Abort, o runtime marca o segmento para Anular e assume o controle dele quando ele reentrada código gerenciado. É preferível que você use um bloqueio gerenciado em vez de bloqueio não gerenciado. WaitHandle.WaitOne,WaitHandle.WaitAny, WaitHandle.WaitAll, Monitor.Enter, Monitor.TryEnter, Thread.Join, GC.WaitForPendingFinalizers, and so on are all responsive to Thread.Interrupt and to Thread.Abort. Além disso, se o thread está em um single-threaded apartment, todas essas operações de bloqueio gerenciadas serão corretamente bomba mensagens em seu compartimento enquanto o thread estiver bloqueado.

Consulte também

Referência

Thread.ApartmentState

Enumeração de ThreadState

ServicedComponent

Thread

Monitor