使用事件处理程序 - 但并非总是......(我如何......)

时间:2016-04-12 09:44:39

标签: c# network-programming

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

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

我想为每个命令创建一个方法,然后公开这些方法,这很简单。该设备还可以说“广播”消息以及我想要操作的消息,所以我使用了一个事件处理程序,这很好..

在事件处理程序中我捕获OK和ERROR样式消息,但理想情况下我还希望能够从上面的方法发送命令并捕获错误并根据命令返回bool值。 / p>

任何人都可以想到我可以做这样的事情,并指出我正确的方向吗?

由于

大卫

1 个答案:

答案 0 :(得分:0)

您可以使用帮助程序等待事件。过去的一些丑陋的代码:

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);