Ho un server COM nativo (Delphi) pubblicizzato come STA (Apartment Threaded Model).C'è qualche ragione per cui l'impostazione di un client .NET gestito per l'uso di thread STA potrebbe causare problemi con le eccezioni in un server COM nativo?
Contiene alcuni algoritmi che generano eccezioni di overflow in alcuni casi. Queste eccezioni sono gestite nel codice e tutto funziona come dovrebbe se accedo al server COM da un client sul thread principale.
Se il client è nativo (Delphi), posso accedere al server da più thread purché rispetti la regola che un oggetto creato su un thread rende tutte le sue chiamate di metodo dallo stesso thread.
Tuttavia, se il client è un client gestito (Vb.NET e C# testato), se si imposta l'ApartmentState dei thread client su MTA, tutto funziona correttamente, ma ottengo un risultato in termini di prestazioni.
Questo mi aspetto che, come suppongo, COM debba fare qualche pasticcio tremendo (ad esempio il marshalling) per assicurarsi che tutti siano felici.
Tuttavia, se cambio ApartmentState in STA e quindi assicuri una connessione diretta tra client e server, il client si bloccherà con un errore di errore, di solito un System.stackoverflowexception in CustomMarshallers.dll.
Se elimini i numeri che causano questi overflow, non ho problemi.
Posso aggirare questo modificando gli algoritmi per non dipendere da eccezioni (probabilmente come avrebbero dovuto essere scritti in primo luogo), ma vorrei capire le ragioni dietro ciò che sta accadendo.
Il codice deve essere thread-safe in STA. –
Il codice è thread-safe. Tutti i dati di istanza sono sicuri in quanto è garantito che vengano chiamati da un singolo thread. Tutti i dati globali sono stati protetti. – Steve
Non banale, ma l'esecuzione del server COM in debugger può aiutare –