使同步成为一个引发事件的void方法,返回事件参数

时间:2012-01-25 12:32:46

标签: c# events

早上好。 采用这个简单的场景:我有一个NetClient,它使用void方法Connect()将自身连接到远程服务器;完成后,NetClient会上升Connected个事件。

我需要将此NetClient包装到另一个无法像这样管理异步逻辑的调用者:此调用者想要一个sync 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类那样? 有人可以给我他的opionin /代码来实现这个目标吗?

谢谢大家!

2 个答案:

答案 0 :(得分:1)

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
            }
        }

答案 1 :(得分:1)

好的你需要:

  1. AutoResetEvent定义为私人会员
  2. Connect
  3. 中初始化
  4. m_NetClient.Connect(ip, port);致电WaitOne()
  5. 之后
  6. _NetClient_Connected来电Set()
  7. 您需要注意的是不要永远锁定代码,因此您必须处理异常并在这些情况下调用Set()或者,请在超时时调用WaitOne,以便在超时后释放锁定。