Compartilhar via


invalidApartmentStateChange MDA

The invalidApartmentStateChange Assistente de depuração gerenciada (MDS) é ativada por qualquer um dos dois problemas:

  • É feita uma tentativa para alterar o estado de apartment com. de um thread que já foi inicializado por COM para um estado de apartamento diferentes.

  • O estado de apartment com. de um thread é alterado inesperadamente.

Sintomas

  • Um estado de apartment com. thread's não é o que foi solicitado.Isso pode causar proxies a serem usados para componentes COM que tenham um modelo de threading diferente do corrente.Isso pode causar um InvalidCastException para ser lançada ao chamar o objeto COM por meio de interfaces que não são conjunto para cruzada apartment de marshaling.

  • Estado de apartment com. o thread é diferente do esperado.Isso pode causar um COMException com um HRESULT de RPC_E_WRONG_THREAD, bem sistema autônomo um InvalidCastException Quando fazer chamadas em um O Tempo de execução Callable Wrapper (RCW). Isso também pode fazer com que alguns componentes do COM single-threaded seja acessado por vários threads ao mesmo time pode levar à corrupção ou perda de dados.

Causa

  • O thread foi inicializado anteriormente para um estado de apartment com. diferente.Observe que o estado de apartment de um thread pode ser conjunto explícita ou implicitamente.As operações explícitas incluem o Thread.ApartmentState propriedade e o SetApartmentState e TrySetApartmentState métodos. Um thread criado usando o Start método implicitamente é definido como MTA a menos que SetApartmentState é chamado antes que o thread foi iniciado. O thread principal do aplicativo também implicitamente é inicializado para MTA a menos que o STAThreadAttribute atributo é especificado no método principal.

  • The CoUninitialize método (ou o CoInitializeEx método) com uma simultaneidade diferente modelo é chamado de thread.

Resolução

conjunto o estado de apartment do thread antes que começa em execução ou aplicar qualquer um do STAThreadAttribute atributo ou a MTAThreadAttribute o atributo para o método principal do aplicativo.

Para a segunda causa, o ideal é que o código que chama o CoUninitialize método deve ser modificado para atrasar a telefonar Sobre que o thread está prestes a terminar e há nenhum RCWs e seus componentes COM subjacentes ainda em uso pelo segmento. No entanto, se não for possível modificar o código que chama o CoUninitialize método e, em seguida, nenhum RCWs devem ser usado de segmentos não-inicializados dessa maneira.

Efeito sobre o tempo de execução

Este MDA não tem efeito sobre o CLR.

Saída

O estado de apartment com. do segmento corrente e o estado em que o código tentar aplicar.

Configuração

<mdaConfig>
  <assistants>
    <invalidApartmentStateChange />
  </assistants>
</mdaConfig>

Exemplo

O exemplo de código a seguir demonstra uma situação que pode ativar este MDA.

using System.Threading;
namespace ApartmentStateMDA
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
        }
    }
}

Consulte também

Conceitos

Diagnosticar erros com assistentes de depuração gerenciadas

Visão geral do empacotamento interop

Referência

MarshalAsAttribute