簡體   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