早上好。
采用这个简单的场景:我有一个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 /代码来实现这个目标吗?
谢谢大家!
答案 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)
好的你需要:
AutoResetEvent
定义为私人会员Connect
m_NetClient.Connect(ip, port);
致电WaitOne()
_NetClient_Connected
来电Set()
您需要注意的是不要永远锁定代码,因此您必须处理异常并在这些情况下调用Set()
。 或者,请在超时时调用WaitOne
,以便在超时后释放锁定。