C# Monitor 使用失败解决办法

C# Monitor 使用失败
本帖最后由 nihao595 于 2014-08-26 15:35:55 编辑
C#中 使用收发线程进行串口通讯。使用独立线程类对串口进行同步读写操作。
接收线程 收到有效数据后,调用 MainWindow中RemoveCurCmd方法移除发送队列中第一条指令。
发送线程自发送队列获取一条指令进行发送。
各个按钮或定时器 调用 MainWindow中AddCmd方法向发送队列中加入一条指令。

现在发现 互斥锁无效,如下代码,执行 RemoveCurCmd()时,发送队列的内容仍然发送变化,即 AddCmd()仍然在向队列添加内容,请大家帮忙分析原因,谢谢。

public static void RemoveCurCmd()
        {
            try
            {
                Monitor.TryEnter(monitorCmdSendBuf);
                Debug.WriteLine("GetCmdSendNum():{0}", GetCmdSendNum());
                if (GetCmdSendNum() > 1)
                {
                    //移走发送完的命令
                    for (int k = 0; k < GetCmdSendNum() - 1; k++)
                        m_cmdSendBuf[k] = m_cmdSendBuf[k + 1];

                }
                else if (GetCmdSendNum() == 1)
                {
                    CMD byCmd = new CMD();
                    m_cmdSendBuf[0] = byCmd;
                }

                //数据长度减 一
                SetCmdSendNum(GetCmdSendNum() - 1);
                Debug.WriteLine("GetCmdSendNum():{0}", GetCmdSendNum());
                Monitor.PulseAll(monitorCmdSendBuf);
            }
            finally
            {
                Monitor.Exit(monitorCmdSendBuf);
            }
        }

public static bool AddCmd(CMD byCmd, //要插入的命令
                                     int uiCmdNumber, //要插入的命令条数
                                     int nPostion //要插入命令队列的位置
            )
        {
            try
            {
                Monitor.TryEnter(monitorCmdSendBuf);
                
                    //临时缓冲区
                    CMD[] cmdSendBuf = new CMD[MAX_CMD_NUM];

                    //每次新添加指令 放置到最先发送位置,导致某些指令一直不能被发送-----所以放置到队列的最后一个
                    if (GetCmdSendNum() < MAX_CMD_NUM)
                    {
                        //nPostion 为当前 发送队列数量
                        m_cmdSendBuf[nPostion] = byCmd;
                        string strPrint = string.Format("nPostion:{0}", nPostion);