Domanda

Ho un componente COM legacy e la mia missione è scrivere un servizio Web che includa il COM e abiliti chiamate simultanee non bloccanti.

Prima di tutto, poiché l'oggetto COM stesso è senza stato, ho deciso di utilizzare l'attributo [ThreadStatic] in modo che ogni thread disponga della propria istanza dell'oggetto COM per impedire l'uso dell'istruzione lock {} e abilitare l'elaborazione reale simultanea , ma sembra che tutte le chiamate siano continuate in modo sincrono.

Ho scritto un codice di prova che esegue un metodo dal componente COM sincrono con il ciclo for {}, quindi ho aggiunto un secondo thread che fa esattamente lo stesso ma a un'altra istanza dell'oggetto COM e non ho visto modifiche, chiamate X consuma sempre il periodo di tempo Y, indipendentemente dal numero di thread. È come se ci fosse un blocco statico o qualcosa del genere ...

Nonostante ciò, processi separati possono elaborare ciascuna chiamata contemporaneamente per davvero. Cosa impedisce ai thread separati di comportarsi allo stesso modo?

Cosa posso fare per abilitare le chiamate simultanee reali al componente COM?

È stato utile?

Soluzione

COM è consapevole del threading e rispetterà il modello di threading richiesto dalla coclasse. Pubblica i suoi requisiti di threading con il valore ThreadingModel nel registro. Se è impostato su " Appartamento " (o manca), COM si assicurerà che tutte le chiamate al metodo vengano effettuate da un singolo appartamento con thread restituendo un proxy per le interfacce QI. Il proxy assicura che la chiamata sia trasferita al thread corretto.

Potresti imbrogliare e usare il puntatore all'interfaccia che hai ottenuto quando hai creato la coclasse in un thread STA ed effettuare chiamate senza marshalling. Dato che la coclasse ha già affermato di non essere in grado di eseguire il multi-threading, è molto improbabile che funzioni correttamente. Avrai semplicemente uno stato interno danneggiato in modo casuale.

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