Я занимаюсь разработкой приложения C # WinForms.Это приложение MDI, которое содержит две формы внутри него.В любое время будет включена только одна из форм.Приложение имеет две темы.Один поток является основным потоком (поток, который управляет GUI).У меня также есть другой поток, работающий в фоновом режиме, который прослушивает TCP-сообщения от сервера (это поток "Client").Когда я получаю одно из этих сообщений, поток клиента запускает событие в поток GUI.Так, например, вот упрощенный пример того, как у меня все изложено в коде:
Список возможных событий в потоке клиента:
public event EventHandler<ConnectEventArgs> ConnectEvent = delegate { };
public event EventHandler<DisconnectEventArgs> DisconnectEvent = delegate { };
public event EventHandler<EdgeMessageEventArgs> EdgeMessageEvent = delegate { };
public event EventHandler<ServerModeEventArgs> ServerModeEvent = delegate { };
public event EventHandler<SpreadDataEventArgs> SpreadDataEvent = delegate { };
Форма # 1, регистрирующаяся для событий:
m_Client.ConnectEvent += new EventHandler<ConnectEventArgs>(OnConnectEvent);
m_Client.DisconnectEvent += new EventHandler<DisconnectEventArgs>(OnDisconnect);
m_Client.EdgeMessageEvent += new EventHandler<EdgeMessageEventArgs>(OnEdgeMessageEvent);
Форма № 2, регистрируемая для событий:
m_Client.ConnectEvent += new EventHandler<ConnectEventArgs>(OnConnectEvent);
m_Client.DisconnectEvent += new EventHandler<DisconnectEventArgs>(OnDisconnect);
m_Client.SpreadDataEvent += new EventHandler<SpreadDataEventArgs>(OnSpreadDataEvent);
Основная форма (окно MDI) регистрируется для одного события:
m_Client.ServerModeEvent += new EventHandler<ServerModeEventArgs>(OnServerModeEvent);
Когда приложение запускаетсявверх, пользователь подключается к серверу.Как только клиент подключается к серверу, запускается ConnectEvent.Сразу после этого запускается ServerModeEvent.Это в основном определит, какая форма будет использоваться в приложении.Проблема, с которой я сталкиваюсь, заключается в том, как выполнить всю регистрацию / отмену регистрации событий в этих формах потокобезопасным способом.
Сначала я думал, что обе формы должны быть отключены при запуске, дождатьсяПользователь должен подключиться к серверу, а затем включить только одну из форм в зависимости от режима сервера.Проблема с этим подходом состоит в том, что процесс регистрации событий в конкретной форме не будет потокобезопасным, поскольку поток клиента может потенциально инициировать событие, пока форма регистрируется для определенных событий.
Моя следующая мысльдолжен был заранее зарегистрировать все события в обеих формах, затем подключиться к серверу и отключить одну из форм.Проблема похожа в том, что отключаемая форма отменяет регистрацию событий, в то время как она потенциально может получить событие из потока клиента.
Я слышал о "слабых событиях" и думал, что это может быть ответом на мою проблему.,Я действительно не знаю, как реализовать это в моем приложении, хотя.Есть какие-нибудь мысли по поводу проблемы, с которой я столкнулся?Могу ли я использовать слабые события?Что-то еще?