发生概率:几个月来只发生了一两次,目前来看概率很小;
问题描述:我从外部线程去访问某个队列实例的MessageQueuePop有时会出现如下错误: 【ReleaseMutex报错,说明代码已经进入WaitOne,不知引起异常的原因。】
[2017-10-30 10:50:53,237] TD000002_baseThread -- DEBUG -- AutomationStation.Utils.MessageQueue [MessageQueuePop] -- System.ApplicationException: Object synchronization method was called from an unsynchronized block of code.
at System.Threading.Mutex.ReleaseMutex()
at AutomationStation.Utils.MessageQueue.MessageQueuePop()
-------消息队列类的代码如下:-----------------------------------------
```using System;
using System.Threading;
using AutomationStation.Interface;
namespace AutomationStation.Utils
{
public class MessageQueue: IMessageQueue
{
private int count;
private int widx;
private int ridx;
private string[] cmd;
private Mutex mutex;
private log4net.ILog log4 = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public MessageQueue()
{
IMessageQueueInit();
}
public void IMessageQueueInit()
{
count = 0;
widx = 0;
ridx = 0;
cmd = new string[100];
mutex = new Mutex();
}
public void IMessageQueueInit(string blockName, string messageQueueName)
{
throw new NotSupportedException();
}
public void MessageQueuePush(string msg)
{
try
{
mutex.WaitOne();
if (count >= 100)
{
mutex.ReleaseMutex();
return;
}
cmd[widx] = msg;
widx = (widx + 1) % 100;
count++;
mutex.ReleaseMutex();
}
catch (Exception ex) { log4.Debug(ex.ToString()); }
}
public string MessageQueuePop()
{
string msg = "";
try
{
mutex.WaitOne();
if (count <= 0)
{
mutex.ReleaseMutex();
return msg;
}
msg = cmd[ridx];
ridx = (ridx + 1) % 100;
count--;
mutex.ReleaseMutex();
}
catch (Exception ex) { log4.Debug(ex.ToString()); }
return msg;
}
public void MessageQueueClear()
{
mutex.WaitOne();
widx = 0;
ridx = 0;
count = 0;
mutex.ReleaseMutex();
}
}
}