Pregunta

Tengo un problema de diseño interesante y esperaba que todos pudieran hacer algunas sugerencias. Estoy usando C # y .NET 3.0

Tengo un marco muy agradable y extensible construido sobre WCF que automatiza la configuración de puntos finales y la creación de contratos. El sistema en el que estoy trabajando podría ejecutarse de diferentes maneras: los puntos finales podrían estar en otro lugar en Internet, ejecutarse en diferentes ensamblajes en la misma caja o incluso ejecutarse en el mismo proceso. WCF es excelente para hacer que todo esto sea transparente, pero en el último caso, me gustaría mejorar la eficiencia:

Me encantaría evitar la sobrecarga de serializar objetos que realmente no van a ninguna parte. Realmente no tiene sentido hacer eso para comunicarse entre dos hilos en el mismo ensamblaje. Al mismo tiempo, me gustaría utilizar el marco basado en WCF que ya está implementado, porque será mucho más fácil de mantener si no tenemos dos vías de comunicación separadas dependiendo de la configuración del sistema.

Mi primer pensamiento fue utilizar punteros de objetos en un contexto inseguro, no para luchar contra la serialización, sino solo para serializar la cantidad mínima. Mi preocupación con esto es que en los mensajes asíncronos en entornos donde el GC está siendo agresivo, el mensaje podría y probablemente desaparecerá antes de que tengamos la oportunidad de desreferenciar el puntero contenido en él, lo que conduciría a muchos problemas.

Mi siguiente pensamiento fue usar GCHandles, pero no estoy seguro acerca de su comportamiento: si un GCHandle ya no está referenciado, pero contiene una referencia a un objeto administrado, ¿ambos son limpiados por el GC, o ninguno? Me preocupa introducir una gran pérdida de memoria al usarlos, porque la posibilidad de que un mensaje se pierda es excelente, y no podremos llamar a Free (), y la documentación que puedo encontrar es ... faltante .

Otra idea es usar la reflexión para mirar todos los objetos administrados, pero parece que la sobrecarga para esto sería enorme, y este sistema debe ser lo más eficiente posible.

Entonces, en resumen, estoy tratando de enviar un objeto a través de un proceso con WCF sin serializarlo, lo que por lo que puedo decir significa mantenerlo vivo incluso si temporalmente no tiene referencias. Parece que debería ser posible, pero me pregunto si estoy tratando de tener mi pastel y comerlo también.

Muchas gracias por tu aporte!

¿Fue útil?

Solución

Investigaría el " NetNamedPipes " Protocolo de transporte en WCF que está diseñado específicamente para la comunicación entre procesos de la misma máquina y que tiene la menor sobrecarga posible (incluida la serialización binaria rápida).

Marc

Otros consejos

Consulte el enlace de transporte nulo en este artículo.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top