2009-03-06 16 views
6

Tengo un problema de diseño interesante y esperaba que todos pudieran hacer algunas sugerencias. Estoy usando C# y .NET 3.0Diseño de comunicación en proceso con WCF (.NET)

tengo un muy buen marco, extensible construido encima de 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 ideal para hacer todo esto 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 conjunto. Al mismo tiempo, me gustaría utilizar el marco basado en WCF que ya está en su lugar, porque será mucho más fácil de mantener si no contamos con dos vías de comunicación separadas dependiendo de la configuración del sistema.

Lo primero que pensé fue utilizar punteros a objetos en un contexto inseguro - a no luchar contra la serialización, pero sólo para serializar la cantidad mínima. Mi preocupación con esto es que en los mensajes asíncronos en entornos donde el GC es agresivo, el mensaje puede y probablemente desaparecerá antes de que tengamos la oportunidad de eliminar la referencia del puntero que contiene, lo que generaría muchos problemas.

Mi siguiente idea fue utilizar GCHandles, pero no estoy seguro de su comportamiento: si ya no se hace referencia a un GCHandle, pero contiene una referencia a un objeto gestionado, ¿el GC lo limpia o ninguno? Me preocupa introducir una gran pérdida de memoria al usar estos, 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 ... que falta .

Otra idea es utilizar la reflexión para buscar objetos en absoluto administrados, pero parece que la sobrecarga de esto sería enorme, y este sistema debe ser lo más eficiente posible.

Por lo tanto, en resumen, estoy tratando de enviar un objeto a través de un proceso con WCF sin serializarlo, que hasta donde puedo decir significa mantenerlo activo aunque no tenga referencias temporalmente. Parece que debería ser posible, pero me pregunto si estoy tratando de comer mi torta y comerla también.

Muchas gracias por sus comentarios!

Respuesta

6

Me gustaría investigar el protocolo de transporte "NetNamedPipes" en WCF que está diseñado específicamente para el mismo de la máquina, la comunicación entre procesos, y que tiene la menor posible sobrecarga (incluyendo serialización binaria rápido).

Marc

9

Mira la unión en este artículo transporte nula.

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

+0

Buena idea, esta aplicación no funciona para mí, sin embargo, y me da un '' System.NotImplementedException' en NullChannelFactory \ '1.OnBeginOpen (tiempo de espera TimeSpan, AsyncCallback de devolución de llamada, el estado del objeto)'. Como este proyecto no está abierto, no es fácil extenderlo y contribuir de nuevo. –

Cuestiones relacionadas