Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Valet av trådningsmodell för ett objekt beror på objektets funktion. Ett objekt som utför omfattande I/O kan ha stöd för fri trådning för att ge maximalt svar till klienter genom att tillåta gränssnittsanrop under I/O-svarstid. Å andra sidan kan ett objekt som interagerar med användaren ha stöd för lägenhetstrådning för att synkronisera inkommande COM-anrop med dess fönsteråtgärder.
Det är enklare att stödja lägenhetstrådning i entrådade lägenheter eftersom COM tillhandahåller synkronisering per samtal. Det är svårare att stödja fri trådning eftersom objektet måste implementera synkronisering. Svar på klienter kan dock vara bättre eftersom synkronisering kan implementeras för mindre kodavsnitt.
Tip
Snabb beslutsguide för COM-klienter:
// UI thread or main thread with a message loop → STA
HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
// Background/worker thread with no message loop → MTA
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
För COM-servrar (processbaserade DLL:er) anger du ThreadingModel registervärdet under InprocServer32 nyckeln:
-
Apartment— Objektet körs i anroparens STA (vanligast för gränssnittsrelaterade objekt) -
Free— Objektet körs i MTA -
Both— Objektet körs i anroparens lägenhet (bäst för allmänna objekt) -
Neutral— Objekt körs i Neutral Apartment (endast COM+)
Om du är osäker börjar du med Both och ser till att objektet är trådsäkert. Detta minskar marshaling mellan trådar genom att låta COM skapa objektet i den anropande trådens apartment, även om marshaling fortfarande kan förekomma vid callback-anrop mellan trådar eller vid åtkomst från andra apartments.
Relaterade ämnen
-
Single-Threaded och för flertrådad kommunikation