Threading gestito e non gestito
I componenti COM utilizzano gli apartment per sincronizzare gli accessi alle risorse. Con gli oggetti gestiti vengono invece utilizzati regioni sincronizzate, primitive di sincronizzazione, quali mutex, blocchi e porte di completamento, e contesti sincronizzati per garantire un utilizzo thread-safe di tutte le risorse condivise. Per ulteriori informazioni sul modello di threading .NET, vedere Threading gestito.
Ai fini dell'interoperabilità, Common Language Runtime crea e inizializza un apartment quando chiama un oggetto COM. Un thread gestito può creare e immettere un apartment a thread singolo (STA, Single-Threaded Apartment), che contiene solo un thread, o un apartment multithread (MTA, Multi-Threaded Apartment), che contiene uno o più thread. Quando un apartment COM e un apartment generato da thread sono compatibili, COM consente al thread chiamante di chiamare direttamente l'oggetto COM. Se gli apartment sono incompatibili, COM crea un apartment compatibile ed effettua il marshalling di tutte le chiamate tramite un proxy nel nuovo apartment.
Il runtime chiama CoInitializeEx per inizializzare l'apartment COM come apartment MTA o STA. In .NET Framework versione 2.0 i thread gestiti vengono inizializzati come MTA se il relativo stato apartment non è stato impostato prima dell'avvio. Utilizzare il metodo SetApartmentState o TrySetApartmentState per impostare lo stato apartment prima dell'avvio del thread.
In .NET Framework versione 2.0 il principale thread dell'applicazione viene inizializzato come MTA a meno che non venga applicato l'attributo STAThreadAttribute alla routine del punto di ingresso.
Nota |
---|
In .NET Framework versioni 1.0 e 1.1 era possibile impostare lo stato apartment dopo l'esecuzione del thread mediante la proprietà System.Threading.ApartmentState, dando luogo a una race condition.In .NET Framework versione 2.0 questa operazione non è consentita. |
Alcuni modelli di programmazione richiedono l'impostazione della proprietà STA su un thread. Per inizializzare elementi quali il trascinamento della selezione in Windows Form, ad esempio, è necessario creare e immettere un apartment a thread singolo.
Nota |
---|
Se né il proxy e lo stub né la libreria dei tipi sono registrati, è possibile che venga generata un'eccezione InvalidCastException quando si chiama un oggetto COM da codice gestito. |
Nella tabella che segue vengono elencati i valori dell'enumerazione ApartmentState e vengono illustrate le corrispondenti chiamate di inizializzazione dell'apartment COM.
Valore dell'enumerazione ApartmentState |
Inizializzazione apartment COM |
---|---|
MTA |
CoInitializeEx(NULL, COINIT_MULTITHREADED) |
STA |
CoIntializeEx(NULL, COINIT_APARTMENTTHREADED) |
Sconosciuto |
CoInitializeEx(NULL, COINIT_MULTITHREADED) |
Se l'oggetto COM e il thread gestito sono in apartment incompatibili, tutte le chiamate rivolte all'oggetto passeranno tramite un proxy creato da COM.
Vedere anche
Concetti
Esposizione di componenti COM a .NET Framework
Esposizione di componenti .NET Framework a COM