Как я могу подписаться на событие через AppDomains (объект. Событие + = обработчик;)

да. Я должен записать алгоритмы шифрования прежде, и это определенно использует их.

Они также полезны при использовании целых чисел и т.д. для того, чтобы отслеживать состояния.

13
задан Cheeso 7 March 2010 в 02:10
поделиться

2 ответа

Причина, по которой ваш пример кода не работает, заключается в том, что объявление события и код, который подписывается на него, находится в том же классе.

В этом случае компилятор «оптимизирует» код, заставляя код, который подписывается на событие, обращаться непосредственно к базовому полю.

В основном, вместо того, чтобы делать это (как и любой код вне класса):

o.add_Event(delegateInstance);

он делает это:

o.EventField = (DelegateType)Delegate.Combine(o.EventField, delegateInstance);

поэтому у меня к вам следующий вопрос: имеет ли ваш реальный пример такое же расположение кода? Находится ли код, который подписывается на событие, в том же классе, который объявляет событие?

Если да, то следующий вопрос: должно ли оно присутствовать или действительно должно быть перемещено из него? Вынося код из класса, вы заставляете компилятор использовать add и? remove специальные методы, которые добавляются к вашему объекту.

Другой способ, если вы не можете или не хотите перемещать код, - это взять на себя ответственность за добавление и удаление делегатов для вашего события:

private EventHandler _TimerExpired;
public event EventHandler TimerExpired
{
    add
    {
        _TimerExpired += value;
    }

    remove
    {
        _TimerExpired -= value;
    }
}

Это заставляет компилятор вызывать добавление и удаление даже из кода внутри того же класса.

13
ответ дан 1 December 2019 в 23:32
поделиться

События в удаленном режиме работают нормально, но есть некоторые сложности, и я предполагаю, что вы столкнулись с одним из них.

Основная проблема заключается в том, что для клиента необходимо подписаться Для события удаленного серверного объекта инфраструктура должна иметь информацию о типе как для клиента, так и для сервера, доступную на обоих концах. Без этого вы можете получить некоторые исключения удаленного взаимодействия, похожие на то, что вы видите.

Есть способы обойти это, в том числе использовать шаблон наблюдателя вручную (вместо использования события напрямую) или предоставить доступный базовый класс или интерфейс. по обе стороны провода.

Я рекомендую прочитать эту статью CodeProject . Он проходит через использование событий с удаленным взаимодействием и хорошо описывает эту проблему в разделе «Создание событий от удаленных объектов».

5
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: