Compartilhar via


Threading gerenciado e não gerenciado no Microsoft Windows

Gerenciamento de todos os threads é concluído por meio de Thread classe, incluindo os threads criados pelo Common linguagem Runtime e aquelas criadas fora do tempo de execução que inserir o ambiente para executar código gerenciado. O tempo de execução monitora todos os threads em seu processo de código dentro do ambiente de execução gerenciado nunca tiverem executado.Ele não rastreia quaisquer outros threads.Segmentos podem inserir o ambiente de execução gerenciado por meio da interoperabilidade COM (porque o tempo de execução expõe objetos gerenciados sistema autônomo objetos COM para o mundo não gerenciado), o COM DllGetClassObject() função e a plataforma chamam.

Quando um thread não gerenciado entra o tempo de execução por meio de, por exemplo, um COM callable wrapper, o sistema verifica o armazenamento local de segmento desse thread para procurar um gerenciado interno Thread objeto.Se for encontrado, o tempo de execução já está ciente de neste thread.Se ele não é possível encontrar um, no entanto, o tempo de execução cria um novo Thread objeto e o instala no armazenamento local de segmento desse segmento.

No gerenciados de threading Thread.GetHashCode é a identificação de thread gerenciado estável.Durante o tempo de vida do seu thread, não será entrarem em conflito com o valor de qualquer Outros thread, 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 controle a relação entre gerenciados e não gerenciados threads.Especificamente, um host sofisticado pode usar a API Fiber para agendar muitos threads gerenciados com o mesmo thread do sistema operacional ou para mover um thread gerenciado entre os threads do sistema operacional diferente.

O mapeamento da Win32 Threading para Threading gerenciado

A tabela a seguir mapeia elementos threads Win32 para seu equivalente em tempo de execução aproximado.Observe que esse mapeamento não representa a funcionalidade idêntica.Por exemplo, TerminateThread não será executada Por fim cláusulas ou liberar recursos e não pode ser impedido.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 linguagem tempo de execução

CreateThread

Combinação de Thread and ThreadStart

TerminateThread

Thread.Abort

SuspendThread

Thread.Suspend

ResumeThread

Thread.Resume

Estado de suspensão

Thread.Sleep

WaitForSingleObject no identificador de thread

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 o CoInitializeEx (OLE32.DLL)

Thread.ApartmentState

Threads gerenciado e apartments COM

Um segmento gerenciado pode ser marcado para indicar que hospedará um apartment single-threaded ou multithread.The GetApartmentState, SetApartmentState, e TrySetApartmentState métodos para o Thread classe retornar e atribua o estado de um thread apartment. Se o estado não tiver sido conjunto, GetApartmentState Retorna ApartmentState.Unknown.

Observação:

Nas versões do .NET estrutura 1.0 e 1.1, o ApartmentState propriedade é usada para obter e conjunto o estado de apartment.

A propriedade pode ser conjunto somente quando o thread está no ThreadState.Unstarted estado; ele pode ser conjunto somente uma vez para um segmento.

Se o estado de apartment for definido antes que o thread é iniciado, o thread foi inicializado sistema autônomo um apartment multithreaded (MTA).O thread do finalizador e todos os threads controlados por ThreadPool são MTA.

Observação importante:

Para o código de inicialização do aplicativo, a única maneira de controlar o estado de apartment é aplicar a MTAThreadAttribute ou o STAThreadAttribute o procedimento de ponto de entrada. sistema autônomo versões do .NET estrutura 1.0 e 1.1, a ApartmentState propriedade pode ser definida sistema autônomo a primeira linha de código. Isso não é permitido no .NET estrutura versão 2.0.

Objetos gerenciado que são expostos para com. se comportam sistema autônomo se eles tinham agregados empacotador de segmentação disponível.Em Outros palavras, elas podem ser chamadas de qualquer apartment com. de uma maneira de segmentação disponível.Os únicos objetos gerenciado que não exibem este comportamento de segmentação disponível são os objetos que derivam de ServicedComponent.

No mundo gerenciado, não há nenhum suporte para o SynchronizationAttribute a menos que você use contextos e instâncias gerenciadas vinculados a contexto. Se você estiver usando EnterpriseServicese, em seguida, o objeto deve derivar de ServicedComponent (que é derivada de ContextBoundObject).

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

Problemas de bloqueio

Se um thread faz uma telefonar não gerenciada do sistema operacional que tenha bloqueado o thread em código não gerenciado, o tempo de execução não terão controle dela para Thread.Interrupt ou Thread.Abort. No caso de Thread.Abort, as marcas de tempo de execução do thread para Anular e obtém controle de quando ele re-enters código gerenciado.É preferível usar 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 estiver 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 threadstate

ServicedComponent

Thread

Monitor