[英]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.