我的应用程序是使用UDP监听通信 我收到的包是图片。
我获得相同的图像两次..当接收第一个imageXX时,我需要等待第二个imageXX,而不是在imageXX上进行一些图像分析。
每个图像都有id,这个id是int,可以是0到199 所以我定义了保存imageXX状态的数组。
我必须始终保持秩序,我知道图像编号8不能将状态改为等待和分析图像编号9之前的状态。
我写了这个简单的代码
const int ElementRange = 200;
MessageElement[] _msgElem = new MessageElement[ElementRange]
// event listener
private void OnMsgWaitReceived(object sender, VideoFrame image)
{
lock(_locker)
{
_msgElem[image.id].ChangeState(WAITING);
}
}
private void OnMsgAnalyzeReceived(object sender, VideoFrame image)
{
lock(_locker)
{
if(_msgElem[image.id].IsWaiting())
{
// ERROR
}
else
{
_msgElem[image.id].ChangeState(ANALYTE);
}
}
}
但是......我看到有两个问题,我不知道如何处理
收到image8后,来到' OnMsgWaitReceived'方法和现在的图像9,在图像10到达' OnMsgWaitReceived'也。
储物柜将使他们远离更新_msgElem ==>当锁柜释放时,image10可能会在image9之前更新其状态,这是错误的。
收到image8后,来到' OnMsgWaitReceived'方法,现在image9和image10进入' OnMsgWaitReceived'还=>储物柜将使他们远离更新_msgElem。
现在第二张图片9已经到了OnMsgAnalyzeReceived'但由于“OnMsgWaitReceived”上的储物柜没有出现image9等待状态,这也是错误的。
使用concurrentQueue是我能做的 - 但我不确定这是最好的解决方案。
有什么想法吗?
由于