Dela via


invalidApartmentStateChange MDA

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

Den invalidApartmentStateChange hanterade felsökningsassistenten (MDS) aktiveras av något av två problem:

  • Ett försök görs att ändra COM-lägenhetstillståndet för en tråd som redan har initierats av COM till ett annat lägenhetstillstånd.

  • COM-lägenhetstillståndet för en tråd ändras oväntat.

Symtom

  • En tråds COM-lägenhetstillstånd är inte det som begärdes. Detta kan göra att proxyservrar används för COM-komponenter som har en trådningsmodell som skiljer sig från den aktuella. Detta kan i sin tur leda till att ett InvalidCastException utlöses när COM-objektet anropas via gränssnitt som inte har konfigurerats för marshalling mellan lägenheter.

  • COM-lägenhetstillståndet för tråden skiljer sig från förväntat. Detta kan orsaka en COMException med en HRESULT av RPC_E_WRONG_THREAD samt en InvalidCastException när du gör anrop på en Runtime Callable Wrapper (RCW). Detta kan också leda till att vissa com-komponenter med en tråd används av flera trådar samtidigt, vilket kan leda till skada eller dataförlust.

Orsak

  • Tråden initierades tidigare till ett annat COM-lägenhetstillstånd. Observera att lägenhetstillståndet för en tråd kan anges antingen explicit eller implicit. De explicita åtgärderna omfattar Thread.ApartmentState egenskapen och SetApartmentState metoderna och TrySetApartmentState . En tråd som skapas med Start metoden anges implicit till MTA om den inte SetApartmentState anropas innan tråden startas. Programmets huvudtråd initieras också implicit såvida MTA inte STAThreadAttribute attributet anges på huvudmetoden.

  • Metoden CoUninitialize (eller CoInitializeEx metoden) med en annan samtidighetsmodell anropas i tråden.

Åtgärd

Ange lägenhetstillståndet för tråden innan den börjar köras, eller använd antingen STAThreadAttribute attributet eller MTAThreadAttribute attributet för programmets huvudmetod.

För den andra orsaken bör koden som anropar CoUninitialize metoden ändras för att fördröja anropet tills tråden är på väg att avslutas och det inte finns några RCW:er och deras underliggande COM-komponenter som fortfarande används av tråden. Men om det inte går att ändra koden som anropar CoUninitialize metoden ska inga RCW:er användas från trådar som är onitialiserade på det här sättet.

Effekt på körningen

Denna MDA har ingen effekt på CLR.

Output

COM-lägenhetstillståndet för den aktuella tråden och det tillstånd som koden försökte tillämpa.

Konfiguration

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

Exempel

I följande kodexempel visas en situation som kan aktivera denna MDA.

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

Se även