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
包装到另一个无法像这样管理异步逻辑的调用方:这个调用方需要一个syncConnect()
方法,如果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说到这里,你是对的:死锁总是在角落后面:)