Megosztás a következőn keresztül:


invalidApartmentStateChange MDA

Feljegyzés

Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.

A invalidApartmentStateChange felügyelt hibakeresési segédet (MDS) két probléma valamelyike aktiválja:

  • Egy olyan szál COM-lakásállapotának módosítására tett kísérlet, amelyet a COM már inicializált egy másik lakásállapotra.

  • Egy szál COM lakásállapota váratlanul megváltozik.

Hibajelenségek

  • A szál COM lakás állapota nem az, amit kértek. Ez azt okozhatja, hogy a proxyk olyan COM-összetevőkhöz használhatók, amelyek szálmodellje eltér az aktuálistól. Ez viszont azt okozhatja InvalidCastException , hogy a COM objektum meghívása olyan felületeken keresztül történik, amelyek nincsenek beállítva a lakásközi rendezéshez.

  • A com lakás állapota a szál eltér a várttól. Ez RPC_E_WRONG_THREAD HRESULT-jával, valamint InvalidCastException futásidejű hívható burkolóval (RCW) kapcsolatos hívásokat okozhatCOMException. Ez azt is okozhatja, hogy egyes egyszálas COM-összetevőkhöz egyszerre több szál is hozzáfér, ami sérüléshez vagy adatvesztéshez vezethet.

Ok

  • A szálat korábban egy másik COM-lakásállapotba inicializálták. Vegye figyelembe, hogy a szál lakásállapota explicit módon vagy implicit módon is beállítható. Az explicit műveletek közé tartozik a Thread.ApartmentState tulajdonság és a TrySetApartmentStateSetApartmentState metódusok. A metódussal Start létrehozott szál implicit módon be van állítva, MTA hacsak a rendszer nem SetApartmentState hívja meg a szálat a folyamat elindítása előtt. Az alkalmazás fő szála implicit módon inicializálva MTA van, kivéve, ha az STAThreadAttribute attribútum meg van adva a fő metódusban.

  • A CoUninitialize másik egyidejűségi modellel rendelkező metódus (vagy CoInitializeEx metódus) meghívása a szálon történik.

Resolution (Osztás)

Állítsa be a szál lakásállapotát a végrehajtás megkezdése előtt, vagy alkalmazza az STAThreadAttribute attribútumot vagy az MTAThreadAttribute attribútumot az alkalmazás fő módszerére.

A második ok esetében ideális esetben a metódust meghívó CoUninitialize kódot úgy kell módosítani, hogy késleltetni lehessen a hívást, amíg a szál le nem fejeződik, és nincsenek RCW-k és azok mögöttes COM-összetevői, amelyeket még mindig használ a szál. Ha azonban nem lehet módosítani a metódust meghívó CoUninitialize kódot, akkor nem szabad RCW-ket használni az ily módon nem inicializált szálakból.

Effektus a futtatókörnyezetre

Ez az MDA nincs hatással a CLR-re.

Hozam

Az aktuális szál COM-lakásállapota és a kód alkalmazásának állapota.

Konfiguráció

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

Példa

Az alábbi példakód egy olyan helyzetet mutat be, amely aktiválhatja ezt az MDA-t.

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

Lásd még