使sync成为引发事件的void方法,返回事件参数

本文关键字:事件 方法 void 返回 参数 sync | 更新日期: 2023-09-27 18:21:27

早上好。以这个简单的场景为例:我有一个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类的东西?有人能给我他的阿片素/代码来实现这个目标吗?

谢谢大家!

使sync成为引发事件的void方法,返回事件参数

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. AutoResetEvent定义为私有成员
  2. Connect中初始化
  3. m_NetClient.Connect(ip, port);后呼叫WaitOne()
  4. _NetClient_Connected中调用Set()

注释

您需要小心的是不要永远锁定代码,因此在这种情况下,您必须处理异常并调用Set()或者在超时的情况下调用WaitOne,以便在某个超时后释放锁定。