У меня есть класс сервера, который создает объект ClientHandler во время выполнения при получении нового соединения. Внутри ClientHandler мне нужно запускать clientEvent при получении определенных сообщений. В моем классе Form у меня есть ссылка на класс Server, но мне нужно подписаться на clientEvent в объекте ClientHandler. Однако на момент проектирования объект еще не существует. Как я могу сделать подписку?
Я создал обработчик событий на сервере, который подписывается на событие clientEvent, и вызывает другое событие serverEvent. В классе Form я подписываюсь на serverEvent. Таким образом, я косвенно слушаю clientEvent. Но я считаю, что есть лучший способ сделать это.
public delegate void SomeEvent(string message);
public class Server
{
public ClientHandler clientHandler;
public event SomeEvent serverEvent;
// callback function when new connection received
public void on_connected()
{
clientHandler = new ClientHandler(...)
clientHandler.clientEvent += ClientEventHandler;
}
public void ClientEventHandler(string message)
{
serverEvent?.Invoke(message)
}
}
public class ClientHandler
{
public event SomeEvent clientEvent;
// callback when message is read
void ReadCallback(...)
{
...
// Some message received
clientEvent?.Invoke("Message received: " + someMessage);
}
public partial class From1 : Form
{
public Form1()
{
Server server = new Server(...);
server.serverEvent += serverEventHandler;
...
}
private void serverEventHandler(string message)
{
// do something with message
}
}
В этом подходе нет ничего плохого, если вы обязательно отмените подписку на событие, когда удалите своего ребенка.
Вот 3 основных подхода к этой проблеме
@KaijunFeng, вы бы сохранили всех своих подключенных клиентов в списке, когда они отключились, вы бы отменили регистрацию обработчика
Спасибо за ответ! Если я буду придерживаться текущего подхода, как вы думаете, где я должен отписаться от дочернего события в классе сервера?