Вы должны закрыть самый внешний выходной поток, который вы создали из сокета. Это закроет его. Закрытие сокета или входного потока не делает этого, поэтому оно недостаточно. Закрыв этот выходной поток, вам не нужно ничего делать.
Каждый раз, когда EventB
срабатывает, EventA
также срабатывает:
class A {
private B b;
public event EventHandler EventA {
add {
b.EventB += value;
}
remove {
b.EventB -= value;
}
}
public A() {
b = new B();
}
// ...
}
Все прослушиватели событий теперь зарегистрированы в классе B.
Тот факт, что события определены в разных классах, означает, что это не одно и то же событие, хотя они могут иметь одну и ту же сигнатуру. Вы не можете одновременно вызывать события из двух разных классов.
Кроме всего прочего, учтите, что событие обычно запускается от экземпляра класса. Какой экземпляр B.eventB
вы вызовете, когда произойдет A.eventA
?
Вы не можете вызвать событие вне класса. Только сам класс может вызывать свои собственные события. С другой стороны, вы можете открыть публичный метод, принимающий те же параметры, который внутренне вызывает указанное событие.
Использование Reflection
также не является вариантом, который позволяет только подписаться на событие другого класса и снять подписку с него.
Нет, нельзя, если только код не находится в классе, который объявляет событие. События можно вызывать только из объявляющего класса. Вероятно, вам придется потреблять событие с аргументами из обоих классов и в ответ вызывать событие, но вы не можете гарантировать, что они будут вызваны одновременно, только примерно в одно и то же время, в зависимости от методов, зарегистрированных для каждого события, поскольку они будут выполняться в одном и том же потоке.