如何管理传入的通信消息?

时间:2015-06-18 04:18:18

标签: c# .net network-programming

我的应用程序是使用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);
              }
       }
  }

但是......我看到有两个问题,我不知道如何处理

  1. 收到image8后,来到' OnMsgWaitReceived'方法和现在的图像9,在图像10到达' OnMsgWaitReceived'也。
    储物柜将使他们远离更新_msgElem ==>当锁柜释放时,image10可能会在image9之前更新其状态,这是错误的。

  2. 收到image8后,来到' OnMsgWaitReceived'方法,现在image9和image10进入' OnMsgWaitReceived'还=>储物柜将使他们远离更新_msgElem。

  3. 现在第二张图片9已经到了OnMsgAnalyzeReceived'但由于“OnMsgWaitReceived”上的储物柜没有出现image9等待状态,这也是错误的。

    使用concurrentQueue是我能做的 - 但我不确定这是最好的解决方案。

    有什么想法吗?

    由于

0 个答案:

没有答案