C# 使用事件处理程序-但不总是。。(我怎么……)
我对C#和OOP概念还很陌生。。所以请原谅我愚蠢的问题 我有一个我想与之通信的系统,它有许多可以通过相关响应调用的命令。(通信通过TCP/IP或串行方式完成)(我使用SendMessage实现了一个接口,以便可以使用多种传输机制) 我想为每个命令创建一个方法,然后公开这些方法,这非常简单。该设备还允许“广播”消息,我想对其进行操作,因此我使用了一个事件处理程序,该程序运行良好 目前,在事件处理程序中,我捕获OK和ERROR样式的消息,但理想情况下,我还希望能够从上述方法发送命令,捕获错误并基于该命令返回bool值 有人能想出一个办法让我做这样的事情,并为我指明正确的方向吗 谢谢C# 使用事件处理程序-但不总是。。(我怎么……),c#,network-programming,C#,Network Programming,我对C#和OOP概念还很陌生。。所以请原谅我愚蠢的问题 我有一个我想与之通信的系统,它有许多可以通过相关响应调用的命令。(通信通过TCP/IP或串行方式完成)(我使用SendMessage实现了一个接口,以便可以使用多种传输机制) 我想为每个命令创建一个方法,然后公开这些方法,这非常简单。该设备还允许“广播”消息,我想对其进行操作,因此我使用了一个事件处理程序,该程序运行良好 目前,在事件处理程序中,我捕获OK和ERROR样式的消息,但理想情况下,我还希望能够从上述方法发送命令,捕获错误并基于该
David您可以使用helper等待事件。一些来自过去的丑陋代码:
public class ComWait
{
ManualResetEvent _waitEvent;
SomeEvent _eventHandler;
public ComWait()
{
_waitEvent = new ManualResetEvent(false);
_eventHandler = new SomeEvent(Watch);
}
void Watch()
{
_waitEvent.Set();
}
public bool Wait(int time = 3000)
{
_waitEvent.Reset();
SomeEvent += _eventHandler;
bool result = _waitEvent.WaitOne(time, false);
SomeEvent -= _eventHandler;
return result;
}
}
用法是
ComWait wait = new ComWait();
if(!wait.Wait())
return; // timeout
// process
它只会阻塞同步方法,直到事件发生或超时为止。添加参数应该很容易:取消对特定事件的阻塞,并将事件处理程序参数传递回调用方
否则,我只需要在通信类中使用方法作为拦截器:
readonly object _waitLock = new object();
public void Wait()
{
lock (_waitLock)
if (!Monitor.Wait(_waitLock, 3000))
throw new TimeoutException("No communications");
}
升起时发出信号事件:
lock (_waitLock)
Monitor.PulseAll(_waitLock);
太宽泛了,你能展示一下你现在在做什么,以及你想要什么吗?在方法内部,您可以订阅事件,阻止执行,直到调用超时或事件处理程序,然后如果问题是这样,则继续。我想我希望能够阻止当前事件处理程序执行任何操作-例如,删除它,然后捕获方法内的响应,仅用于获取该命令响应,然后再次启用它,但感觉不正确,然后不要使用事件处理程序。提供另一种信号机制(例如,
Monitor.Pulse
/Monitor.Wait
)。过去,我为通信类编写了helper,该类订阅事件,等待特定的回复,然后返回。但后来我发现Monitor
的存在(多亏了)并从此开始使用它。