Hace algunos años, diseñé e implementé un sistema empresarial crítico que utilizaba .NET Remoting. Tuvimos un cliente implementado como una GUI de Windows Forms, un servidor implementado como un servicio de Windows y una base de datos de SQL Server.
Diseñé para la resolución de problemas/depuración/desarrollo, por lo que uno de mis primeros criterios de diseño fue que podía eliminar trivialmente toda la implementación de .NET Remoting y ejecutar todo el sistema en mi escritorio. Entonces, podría desactivar la comunicación remota cambiando una configuración de configuración booleana a "falso" = apagado.Luego podría solucionar problemas, depurar, desarrollar completamente sin la sobrecarga o la interferencia de .NET Remoting.
Parece que esto sería valioso para su situación también. Como cuestión de hecho, no puedo imaginar una situación en la que esa no sea una característica deseable, especialmente porque es fácil de implementar.
Por lo tanto, para implementarlo, cada uno de los clientes y el código del servidor usaban la configuración para decidir qué clase de implementación instanciar para la comunicación con el otro lado. Toda la comunicación se realizó a través de una interfaz personalizada C# que tenía dos clases concretas de implementación en cada lado: una clase implementó la comunicación usando .NET Remoting, la otra clase implementó la comunicación como un paso directo en el proceso (llamadas directas).
Solo un par de clases (una en cada lado) sabían algo acerca de .NET Remoting, por lo que el aislamiento fue total. La mayoría de las veces, todos los desarrolladores trabajaron con la comunicación remota desactivada, que era más rápida y sencilla. Cuando lo necesitaban, en raras ocasiones, lo activaban (la mayoría de las veces solo yo, o cuando alguien se conectaba a prueba/producción para solucionar problemas).
Por cierto, hice la interfaz de interacción remota muerto simple: respuesta pública ejecutar (Solicitud)
Más allá de eso, también se utiliza el depurador lanzamiento de punta se mencionó anteriormente, y estoy de acuerdo que es necesario tener en cuenta el impacto en el enhebrado de GUI.
Bueno, dices "RemoteObject crea subprocesos no ThreadPool que usan ThreadPool para hacer el procesamiento IO". ¿No puede ser esta la razón (es decir, los hilos que no son ThreadPool están esperando a que se abran las ranuras de ThreadPool)? – Alan
¿Por qué eso afectaría el hilo en el que está RemoteObject? La GUI no puede acceder al método RemoteObject al que está llamando. – Chris
Si es posible cambiar esto, remójense para WCF. – Will