Remoting events: обработчик срабатывает на сервере!
От: server_mouse Беларусь about:blank
Дата: 08.10.09 08:47
Оценка:
Привет всем.
Есть приложение, которое может запускаться в разных процессах, но должно использовать одни ресурсы в рамках локальной машины. Remoting как средство межпроцессного взаимодействия напрашивается сам собой.
Раньше с Remoting не работал, поэтому написал простенький пример:

Серверный объёкт:
public class TestService : MarshalByRefObject
{
    public event EventHandler<EventArgs> TestEvent;

    public void Test()
    {
        Console.WriteLine("Test() called. Process:" + Process.GetCurrentProcess().Id);
        if (TestEvent != null)
            TestEvent(this, null);
    }        
}


Собственно само приложение:
[STAThread]
static void Main(string[] args)
{
    var isServiceNotStarted = false;
    using (var mutex = new Mutex(true, "RemotingTest", out isServiceNotStarted))
    {
        TestService service;
        if (isServiceNotStarted)
        {
            Console.WriteLine("Starting service...");
            RemotingConfiguration.Configure("service.config", false);
            service = new TestService();
        }
        else
        {
            Console.WriteLine("Starting client...");
            RemotingConfiguration.Configure("client.config", false);
            service = new TestService();
            service.TestEvent += (sender, arg) =>
            {
                Console.WriteLine("TestEvent fired, Process:" + Process.GetCurrentProcess().Id + " Thread:" + Thread.CurrentThread.ManagedThreadId);
            };
        }
        Console.WriteLine("Process:" + Process.GetCurrentProcess().Id + " Thread:" + Thread.CurrentThread.ManagedThreadId);

        service.Test();                

        Console.WriteLine("Press Enter to exit");
        Console.ReadLine();
    }
}

Здесь тоже вроде-бы всё просто: если приложение ещё не запущено, запускаем Remoting-сервер, если запущено — клиент. Дополнительно клиента подписываем на событие.

Проблема в том, что обработчик события всегда вызывается в контексте процесса сервера. Как это вообще происходит — ума нге приложу.
Запускаем первый экземпляр (сервер):

Starting service...
Process:4644 Thread:1
Test() called. Process:4644
Press Enter to exit


Запускаем второй (клиент):

Starting client...
Process:3576 Thread:1
Press Enter to exit

как видите упоминания о том что у клиента сработал обработчик события нет. Зато он появляется в сервере:

Starting service...
Process:4644 Thread:1
Test() called. Process:4644
Press Enter to exit
Test() called. Process:4644
TestEvent fired, Process:4644 Thread:4


Ситуация повторяется для любого кол-ва клиентов — события зажигаются на сервере.
Почему??? Что неверно???
Повреждение мозга после ректальной биопсии — редкая штука (с) Хаус
remoting event
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.