繁体   English   中英

验证事件的提升

[英]Validate a raising of event

我尝试验证事件的引发:

我有一个设备,在我发送命令后它会返回一些消息。

当我在串行端口上收到新消息时,我有一个事件会引发。

我恢复了这个事件,我想在向我的设备发送其他命令之前验证这个提升。

Public Constructor()
{
 ModuleProtocole.MessageReceive += SendValidate;
}

SendValidate()
{
//maybe something to write here?
}

SendNewMessage()
{
 ModuleProtocole.SendMessage ("Version");
 // if SendValidate() is call because of event go to next line
 ModuleProtocole.SendMessage ("Value1");
}

如果我理解这个问题,并给出最简单的答案。

private bool? _hasEventBeenRaised;

private void SendValidate()
{
   _hasEventBeenRaised = true;
}

private void SendNewMessage()
{
   if(_hasEventBeenRaised == false)
   {
      Console.WriteLine("No event received");
      return;
   }
   
   _hasEventBeenRaised = false;

   // send message
    
}

注意:这忽略了任何其他问题,此外,如果在另一个线程上引发事件,您将需要使用lock来确保没有线程问题。

过于谨慎的锁定方法

private bool? _hasEventBeenRaised;
private object _sync = new object();

private void SendValidate()
{
   lock(_sync)
   {
      _hasEventBeenRaised = true;
   }
}

private void SendNewMessage()
{
    lock(_sync)
    {
       if(_hasEventBeenRaised == false)
       {
           Console.WriteLine("No event received");
           return;
       }
   
       _hasEventBeenRaised = false;

       // send message
    }
    
}

为什么不直接使用 SendValidate function(当设备响应第一条消息时调用)来发送第二条消息?

但理想情况下我会用一些信号来做,所以基本上我会创建一个发送消息,它会阻塞 - 等待信号(最初应该是空闲的),然后锁定信号(信号量)然后发送消息。 然后消息回调事件应该释放信号。

https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphoreslim?view=netcore-3.1

var semaphore = new SemaphoreSlim(1, 1); // 1 available call, max. 1 concurrent calls

SendMessage()
{
  this.semaphore.WaitOne();
  // NOTE: add send message here
}

MessageReceived()
{
  this.semaphore.Release(1);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM