使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类的东西?有人能给我他的阿片素/代码来实现这个目标吗?
谢谢大家!
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
}
}
确定您需要:
- 将
AutoResetEvent
定义为私有成员 - 在
Connect
中初始化 m_NetClient.Connect(ip, port);
后呼叫WaitOne()
- 在
_NetClient_Connected
中调用Set()
注释
您需要小心的是不要永远锁定代码,因此在这种情况下,您必须处理异常并调用Set()
或者在超时的情况下调用WaitOne
,以便在某个超时后释放锁定。