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