Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使sync成为引发事件并返回事件参数的void方法_C#_Events - Fatal编程技术网

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

C# 使sync成为引发事件并返回事件参数的void方法,c#,events,C#,Events,早上好。 以这个简单的场景为例:我有一个NetClient,它使用一个void方法Connect(),将自己连接到远程服务器;完成后,NetClient将引发Connected事件 我需要将这个NetClient包装到另一个无法像这样管理异步逻辑的调用方:这个调用方需要一个syncConnect()方法,如果ok,该方法将返回true(为简单起见,现在不要考虑连接错误) 代码如下所示: public class Client { NetClient m_NetC

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

我需要将这个
NetClient
包装到另一个无法像这样管理异步逻辑的调用方:这个调用方需要一个sync
Connect()
方法,如果ok,该方法将返回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类的东西? 有人能给我他的意见/代码来实现这个目标吗

谢谢大家!

A应该做到这一点

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
            }
        }
好的,您需要:

  • AutoResetEvent
    定义为私有成员
  • Connect
  • m_NetClient.Connect之后(ip,端口)调用
    WaitOne()
  • \u NetClient\u Connected中
    调用
    Set()

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

    感谢您的回复;我试着使用Monitor.Wait e Monitor.Pulse,在Connect()上创建新线程,它似乎可以工作。我也会尝试你的解决方案,谢谢!NandoThanks说到这里,你是对的:死锁总是在角落后面:)