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 (vagyCoInitializeEx
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: