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