C# Monitor 使用失败解决办法
C# Monitor 使用失败
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);
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);