错误提示:“此游标当前指向的消息已由不使用此游标的另一个进程或另一个 Receive 调用从队列中移除。”我用数据库填充消息队列,使用程序每隔一段时间检查一下消息队列的个数:比如1000,如果小于这个数字,就用一个子线程填充此队列,同时另一个子线程,不停地从消息队列中取出Message,进行下面的操作。大概就是这样一个过程。现在的问题就像上面的错误提示,我用   queue.GetAllMessages().length 判断消息个数,用Receive()获取消息,但这两个操作好像有冲突,不经常有,隔一段时间可能就出现一次,造成程序崩溃请教一下,该如何解决?

解决方案 »

  1.   

    你的两个方法操作的队列可能是不同的。
    并发操作问题 lock锁代码试试
      

  2.   

    对那个操作加锁?消息队列能加锁吗?        /// <summary>
            /// 获取消息队列数量
            /// </summary>
            /// <returns></returns>
            public static int MsgCount()
            {
                MessageQueue queue = new MessageQueue(@".\Private$\MyPublicQueue");
                Message[] strMsg = null;
                if (queue.GetAllMessages() != null && queue.GetAllMessages().Length > 0)
                {
                    strMsg = queue.GetAllMessages();
                }            return strMsg.Length;
            }        /// <summary>
            /// 填充消息队列
            /// </summary>
            public static void FillMsgQueue()
            {
                MessageQueue queue = null;
                string queueName = @".\Private$\MyPublicQueue";
                if (MessageQueue.Exists(queueName))
                    queue = new MessageQueue(queueName);
                else
                    queue = MessageQueue.Create(queueName, false);
                while (true)
                {
                    int msgCount = MsgCount();
                    if (msgCount < 100)
                    {
                        //获取25条消息实例
                        List<Position_51> list = WebGeter.Code.GeterDAL.SelectTopNUrl();                    //发送消息实例,填充队列
                        for (int i = 0; i < list.Count; i++)
                        {
                            SendMsg(list[i]);
                        }
                    }
                    //System.Threading.Thread.Sleep(1000);
                }
            }
      

  3.   

    此游标当前指向的消息已由不使用此游标的另一个进程或另一个 Receive 调用从队列中移除。
      

  4.   

    MessageQueue queue = new MessageQueue(@".\Private$\MyPublicQueue"); 
    把他拿出来,不要放在方法里。拿出来作为所有方法都能访问的变量。然后
    lock(queue)
    {
    1。判断
    2。添加
    }
      

  5.   

    MSDN上的一个说法MessageAlreadyReceived消息正文:“游标当前指向的消息已被另一个进程或另一个在不使用此游标的情况下接收消息的调用从该队列中移除。” 
    当某些其他光标、应用程序或系统管理员已从队列中移除该消息时,消息队列返回此错误。当使用 MessageEnumerator 类(例如通过对 MessageQueue.GetMessageEnumerator 或 MessageQueue.GetEnumerator 的调用返回的实例)时最可能发生该错误。