Domanda

Ho un problema di progettazione interessante e speravo che tutti potessi dare qualche suggerimento. Sto usando C # e .NET 3.0

Ho un framework molto bello ed estensibile basato su WCF che automatizza la configurazione degli endpoint e la creazione di contratti. Il sistema su cui sto lavorando potrebbe essere eseguito in diversi modi: gli endpoint potrebbero essere da qualche altra parte su Internet, in esecuzione in assiemi diversi sulla stessa scatola o persino nello stesso processo. WCF è ottimo per rendere tutto questo trasparente, ma nell'ultimo caso, vorrei migliorare l'efficienza:

Mi piacerebbe evitare il sovraccarico di serializzare oggetti che non vanno davvero da nessuna parte. Non ha davvero senso farlo per comunicare tra due thread nello stesso assembly. Allo stesso tempo, mi piacerebbe utilizzare il framework basato su WCF che è già in atto, perché sarà molto più facile da mantenere se non abbiamo due percorsi di comunicazione separati a seconda della configurazione del sistema.

Il mio primo pensiero è stato quello di utilizzare i puntatori a oggetti in un contesto non sicuro, non per combattere la serializzazione, ma solo per serializzare la quantità minima. La mia preoccupazione è che sui messaggi asincroni in ambienti in cui il GC è aggressivo, il messaggio potrebbe e probabilmente andrà via prima che abbiamo la possibilità di dereferenziare il puntatore in esso contenuto, il che porterebbe a molti problemi.

Il mio prossimo pensiero è stato quello di utilizzare GCHandles, ma non sono sicuro del loro comportamento: se un GCHandle non fa più riferimento, ma contiene un riferimento a un oggetto gestito, entrambi vengono ripuliti dal GC o nessuno dei due? Sono preoccupato di introdurre un'enorme perdita di memoria usando questi, perché la possibilità che un messaggio si perda è grande e non saremo in grado di chiamare Free () e la documentazione che riesco a trovare è ... carente .

Un altro pensiero è quello di usare la riflessione per guardare tutti gli oggetti gestiti, ma sembra che il sovraccarico per questo sarebbe enorme, e questo sistema deve essere il più efficiente possibile.

Quindi, in sintesi, sto cercando di inviare un oggetto attraverso un processo con WCF senza serializzarlo, che per quanto posso dire significa mantenerlo in vita anche se temporaneamente non ha riferimenti. Sembra che dovrebbe essere possibile, ma mi chiedo se sto cercando di avere la mia torta e mangiarla anch'io.

Grazie mille per il tuo contributo!

È stato utile?

Soluzione

Vorrei indagare su " NetNamedPipes " protocollo di trasporto in WCF che è specificamente progettato per la comunicazione tra processi della stessa macchina e che presenta il minor sovraccarico possibile (compresa la serializzazione binaria rapida).

Marc

Altri suggerimenti

Scopri l'associazione di trasporto null in questo articolo.

http://www.codeproject.com/KB/WCF/NullTransportForWCF.aspx

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