Domanda

Secondo questo articolo se registro il mio oggetto COM con " Both " o " Gratuito " modello di threading quell'oggetto deve essere completamente thread-safe. In particolare, tutti gli accessi alle variabili condivise globali devono essere sincronizzati e anche tutti gli accessi alle variabili dei membri devono essere sincronizzati. È un grande sforzo.

Ora capisco che essere in grado di registrare il mio oggetto come usando " Gratuito " il modello di threading è vantaggioso e potrebbe valere la pena pagare il prezzo per renderlo completamente thread-safe. Ma perché dovrei voler fare lo stesso e registrare il mio oggetto usando " Entrambi " modello di threading invece? Quale sarebbe il vantaggio? Come faccio a scegliere tra " Entrambi " e " Gratuito " ;?

È stato utile?

Soluzione

Entrambi i modelli di threading

Il motivo principale per contrassegnare il componente come modello di threading di supporto "Entrambi" serve per migliorare le prestazioni quando il componente viene chiamato da un Single Threaded Apartment (STA).

Se si contrassegna il componente come MTA e il componente viene creato all'interno di uno STA, il componente verrà creato in un appartamento MTA separato e " il marshalling inter-appartamento risultante potrebbe degradare le prestazioni abbastanza da negare tutto il lavoro svolto per creare un componente efficiente, a thread libero " . Tuttavia, se il modello di threading del componente è contrassegnato come " Entrambi " quindi verrà creato all'interno dell'appartamento dell'oggetto STA e vi si accederà direttamente.

Quindi, se ritieni che il tuo componente possa essere chiamato all'interno di uno STA (tutti gli oggetti COM VB6 sono STA) potresti voler contrassegnare il modello di threading come " Entrambi " ;.

Un buon articolo KB su Modelli di threading OLE .

Modello di threading gratuito

Potresti voler utilizzare un " gratuito " modello di thread se il componente utilizza altri componenti contrassegnati come "Gratuito". Se il componente è stato contrassegnato come " Entrambi " quindi potrebbe esserci un eccessivo cambio di appartamento tra "Entrambi" componente in esecuzione in STA e MTA. Come regola generale, prova a creare il componente il più vicino possibile al chiamante (ovvero lo stesso appartamento) mentre funziona correttamente in tutti gli scenari.

Un'altra situazione che giustificherebbe la marcatura del componente come " gratuito " è se si blocca esplicitamente (ad esempio Thread.Sleep). Se il componente è contrassegnato come " Entrambi " e istanziato in uno STA, il componente bloccherebbe il pump dei messaggi STA.

Altre considerazioni e scenari

Se stai pensando di utilizzare il componente in IIS, ci sono altre cose da considerare. Per IIS, " Entrambi " è l'impostazione consigliata. Principalmente per evitare problemi di blocco con i componenti thread di Apartment, l'accesso performante a COM + ObjectContext e il fatto che " Free " i componenti threadizzati utilizzano il contesto di sicurezza del sistema (se è necessario accedere al contesto di sicurezza dell'utente). Vedere Selezione di un modello di threading per componenti in IIS per ulteriori informazioni su IIS considerazioni sul threading.

Altre cose da considerare sono il supporto COM + e il comportamento dei componenti se vengono eseguiti in COM + e se i puntatori all'interfaccia vengono passati e archiviati.

Un eccellente articolo è Threading COM e architettura delle applicazioni nelle applicazioni COM + . Ha un focus COM + ma discute anche di COM. Per la tua domanda, leggi la sezione intitolata "Suggerimenti per il modello di threading". Microsoft ha rimosso l'articolo originale, quindi sto collegando a una copia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top