闪电001 2017-10-30 05:03 采纳率: 33.3%
浏览 2239

c# Mutex 问题:从不同步的代码块访问对象同步方法

发生概率:几个月来只发生了一两次,目前来看概率很小;
问题描述:我从外部线程去访问某个队列实例的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();
    }


}

}



  • 写回答

1条回答 默认 最新

  • devmiao 2017-10-30 13:58
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?