Однажды я развернул систему, которая использовала удаленное взаимодействие и где сервер запускал некоторые события, на которые клиент мог подписаться.
Чтобы сделать это возможным, вы должны установить typeFilterLevel на полную, а также создать промежуточный объект, известный на клиенте и на сервере, чтобы иметь возможность обрабатывать ваши события .
Например:
Этот класс известен на сервере и на стороне клиента.
public abstract class MyDelegateObject : MarshalByRefObject
{
public void EventHandlerCallback( object sender, EventArgs e )
{
EventHandlerCallbackCore(sender, e);
}
protected abstract void EventHandlerCallbackCore(object sender, EventArgs e );
public override object InitializeLifetimeService() { return null; }
}
На стороне клиента вы создаете другой класс, который наследуется от вышеуказанного класса и реализует фактическую логику, которая должна выполняться при возникновении события.
public class MyConcreteHandler : MyDelegateObject
{
protected override EventHandlerCallbackCore(object sender, EventArgs e)
{
// do some stuff
}
}
Вы просто присоединяете обработчик событий к событию удаленного объекта следующим образом:
MyConcreteHandler handler = new MyConcreteHandler();
myRemoteObject.MyEventOccured += new EventHandler(handler.EventHandlerCallback);
Конечно, если вы обновляете элементы управления Winform в своем классе EventHandler, этот класс также должен реализовывать ISynchronizeInvoke.