c# - ¿Cuál es la mejor forma de comunicarse entre los AppDomains?
.net remoting (5)
Tengo una aplicación que necesita enviar un volumen moderadamente alto de mensajes entre varios AppDomains. Sé que podría implementar esto usando la comunicación remota, pero también he notado que hay delegados entre dominios. ¿Alguien ha visto este tipo de problema?
Esto es sólo una idea rápida, pero escuché que incluso para la comunicación entre dominios WCF sería el enfoque recomendado, comenzando desde .NET 3.0, por supuesto. En realidad, esto tiene sentido, ya que la comunicación remota es solo otra tecnología envuelta por WCF.
Un delegado de dominios cruzados solo permite un método nulo con cero parámetros, y probablemente no sea lo que piensas que es. Es apenas útil como una devolución de llamada simple para fines de notificación de un dominio de aplicación a otro, por ejemplo, un método como InitComplete () o algo así.
Remoting es la ÚNICA opción, ya sea que lo llame WCF o lo que sea, pasando tipos serializables, o usando tipos de MBRO (MarshalByRefObjects). No es tan difícil como crees
-Oisin
Acabo de descubrir que también puede usar AppDomain.SetData, pero esto es solo una forma desde el dominio de host al dominio secundario.
static void RunInChildDomain()
{
AppDomain childDomain = AppDomain.CreateDomain("friendlyName");
string parameterValue = "notmii";
childDomain.SetData("parameter", parameterValue);
childDomain.DoCallBack(PrintName);
}
static void PrintName()
{
string Name = Convert.ToString(AppDomain.CurrentDomain.GetData("parameter"));
Console.WriteLine(Name);
}
También puede crear una comunicación impulsada por excepciones entre el dominio de aplicación hijo y el servidor mediante el evento AppDomain.FirstChanceException :)
He tenido un buen éxito al usar WCF con un enlace de tuberías con nombre. El uso de conductos con nombre no crea tráfico de red y utiliza codificación binaria, por lo que debe ser bastante rápido sin sacrificar la capacidad de distribución en escenarios de escalado futuros.
EDITAR: Consulte aquí para obtener información más detallada, incluido un enlace a un ejemplo de implementación.
Quiero ampliar la respuesta de xOn. Recomienda usar WCF o MarshalByRefObject, pero dado que la pregunta es acerca de la comunicación entre los AppDomains, y no sobre la comunicación entre los procesos, creo que el enfoque de MBRO es mucho más fácil de implementar y, por lo tanto, es la respuesta correcta.
Cuando estaba investigando este problema yo mismo, al principio me costó entender cómo el AppDomain hijo podía comunicarse con el padre, hasta que me di cuenta de que podía pasar un control de un objeto MBRO al niño, y el niño podía desenvolver ese mango para comunicarse con el padre (o cualquier otro dominio de la aplicación). Publiqué una solución a mi propia pregunta aquí .
Posteriormente aprendí que puede definir una interfaz, implementar esa interfaz en una clase compleja y luego pasarle un identificador a solo la interfaz. Esto puede reducir en gran medida la cantidad de ensamblajes que pueden requerirse para cargar el AppDomain hijo.