Pergunta

Eu tenho uma aplicação que precisa enviar um moderadamente alto volume de mensagens entre um número de AppDomains.Eu sei que eu poderia implementar isso usando o sistema de interacção remota, mas eu também notei que há de domínio entre os delegados.Alguém já olhou para este tipo de problema?

Foi útil?

Solução

Tive um bom sucesso usando o WCF com uma ligação de tubos nomeados. O uso de tubos nomeados não cria tráfego de rede e usa a codificação binária, por isso deve ser muito rápido sem sacrificar a capacidade de distribuir em cenários futuros de escala.

EDIT: consulte aqui Para informações mais detalhadas, incluindo um link para um exemplo de implementação.

Outras dicas

Um domínio cruzado delegado só permite um método void, com zero de parâmetros, e provavelmente não é o que você pensa.É pouco útil como uma simples chamada de retorno para fins de notificação, a partir de um domínio de aplicação para outro, por exemplo,um método como o InitComplete() ou algo assim.

Sistema de interacção remota é a ÚNICA opção, se você chamá-lo WCF ou qualquer outra coisa, passando serializable tipos, ou usando MBRO tipos (MarshalByRefObjects).Não é tão difícil como você pensa.

-Oisin

Acabei de descobrir que você também pode usar o AppDomain.SetData, mas isso é apenas de uma maneira do domínio do host ao domínio filho.

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);
}

Você também pode criar uma comunicação orientada a exceção entre o AppDomain Child e Host usando o evento AppDomain.FirstchanceException :)

Isso é apenas um pensamento rápido, mas ouvi dizer que mesmo para comunicação entre domínios WCF seria a abordagem recomendada, a partir do .NET 3.0, é claro. Na verdade, isso faz sentido, pois o Remoting é apenas mais uma tecnologia embrulhada pelo WCF.

Eu quero expandir a resposta de Xon. Ele recomenda o uso do WCF ou MarshalbyRefobject, mas, como a pergunta faz sobre a comunicação entre os aplicativos, e não sobre a comunicação entre os processos, acho que a abordagem MBRO é significativamente mais simples de implementar e, portanto, é a resposta certa.

Quando eu estava pesquisando esse problema, lutei a princípio para entender como o AppDomain Child poderia se comunicar com os pais, até que percebi que você poderia passar uma alça para um objeto MBRO para a criança, e a criança poderia então desembrulhar esse manuseio para Comunique -se de volta ao pai (ou qualquer outro aplicativo). Eu postei uma solução para minha própria pergunta aqui.

Posteriormente, aprendi que você pode definir uma interface, implementar essa interface em uma classe complexa e depois passar um identificador apenas para a interface. Isso pode reduzir bastante o número de montagens que podem ser necessários para carregar o appdomain filho.

O CallContext permite a passagem de dados entre os appdomains:

   CallContext.LogicalSetData("Key", "My value");
   Console.WriteLine("{0} from {1}", CallContext.LogicalGetData("Key"),               
   AppDomain.CurrentDomain.FriendlyName);

   var appDomain = AppDomain.CreateDomain("Worker");
   appDomain.DoCallBack(() => Console.WriteLine("{0} from {1}", 
       CallContext.LogicalGetData("Key"), 
       AppDomain.CurrentDomain.FriendlyName));
   AppDomain.Unload(appDomain);

   CallContext.FreeNamedDataSlot("Key");

O código usa o System.Runtime.Remoting.Messaging. Pessoalmente, não medi o desempenho desta solução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top