Сделать синхронизацию пустым методом, который вызывает событие, возвращая аргументы события - PullRequest
1 голос
/ 25 января 2012

Доброе утро. Возьмем такой простой сценарий: у меня есть NetClient, который подключается к удаленному серверу, используя метод void Connect(); По завершении NetClient возникает событие Connected.

Мне нужно обернуть это NetClient другому вызывающему, который не может управлять асинхронной логикой, как это: этот вызывающий хочет метод синхронизации Connect(), который возвращает true, если в порядке (для простоты пока не думайте об ошибках подключения)

Код выглядит так:


    public class Client
    {
        NetClient m_NetClient = new NetClient();

        public void Connect(string ip, int port)
        {
            m_NetClient = new NetClient();
            m_NetClient.Connected += _NetClient_Connected;
            m_NetClient.Connect(ip, port);
        }

        private void _NetClient_Connected(object sender, EventArgs e)
        {
            //...
        }
    }

Что я могу сделать, чтобы синхронизировать эту логику? Мне нужно создать новый поток в обработчике событий, чем использовать что-то вроде класса Monitor? Может ли кто-нибудь дать мне свой опионин / код для достижения этой цели?

Спасибо всем!

Ответы [ 2 ]

1 голос
/ 25 января 2012

ОК. Вам нужно:

  1. Определить AutoResetEvent как приватного участника
  2. Инициализируйте его в Connect
  3. После m_NetClient.Connect(ip, port); звоните WaitOne()
  4. В _NetClient_Connected звоните Set()

Примечание

Вам нужно быть осторожным, чтобы не блокировать ваш код навсегда, поэтому вам придется обрабатывать исключения и вызывать Set() и в этих случаях. В качестве альтернативы , позвоните WaitOne с тайм-аутом, чтобы блокировка была снята после некоторого тайм-аута.

1 голос
/ 25 января 2012

A AutoResetEvent должно сработать.

public class Client
        {
            NetClient m_NetClient = new NetClient();
            AutoResetEvent _lock = new AutoResetEvent(false);
            bool result;

            public bool Connect(string ip, int port)
            {
                m_NetClient = new NetClient();
                m_NetClient.Connected += _NetClient_Connected;
                m_NetClient.Connect(ip, port);
                _lock.WaitOne();//wait for thread to finish
                return result;
            }

            private void _NetClient_Connected(object sender, EventArgs e)
            {
                //...
                result = e.Result;
                _lock.Set(); //inform waiters
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...