C# 使用事件处理程序-但不总是。。(我怎么……)

C# 使用事件处理程序-但不总是。。(我怎么……),c#,network-programming,C#,Network Programming,我对C#和OOP概念还很陌生。。所以请原谅我愚蠢的问题 我有一个我想与之通信的系统,它有许多可以通过相关响应调用的命令。(通信通过TCP/IP或串行方式完成)(我使用SendMessage实现了一个接口,以便可以使用多种传输机制) 我想为每个命令创建一个方法,然后公开这些方法,这非常简单。该设备还允许“广播”消息,我想对其进行操作,因此我使用了一个事件处理程序,该程序运行良好 目前,在事件处理程序中,我捕获OK和ERROR样式的消息,但理想情况下,我还希望能够从上述方法发送命令,捕获错误并基于该

我对C#和OOP概念还很陌生。。所以请原谅我愚蠢的问题

我有一个我想与之通信的系统,它有许多可以通过相关响应调用的命令。(通信通过TCP/IP或串行方式完成)(我使用SendMessage实现了一个接口,以便可以使用多种传输机制)

我想为每个命令创建一个方法,然后公开这些方法,这非常简单。该设备还允许“广播”消息,我想对其进行操作,因此我使用了一个事件处理程序,该程序运行良好

目前,在事件处理程序中,我捕获OK和ERROR样式的消息,但理想情况下,我还希望能够从上述方法发送命令,捕获错误并基于该命令返回bool值

有人能想出一个办法让我做这样的事情,并为我指明正确的方向吗

谢谢


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
的存在(多亏了)并从此开始使用它。