C#中Mutex的用法

C#中Mutex是互斥锁,位于System.Threading 命名空间中。

顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元。

如果当前有一个线程拥有它,在没有释放之前,其它线程是没有权利拥有它的。我们可以把Mutex看作洗手间,上厕所的人看作线程;上厕所的人先进洗手间,拥有使用权,上完厕所之后出来,把洗手间释放,其他人才可以使用。

线程使用Mutex.WaitOne()方法等待C# Mutex对象被释放,如果它等待的C# Mutex对象被释放了,它就自动拥有这个对象,直到它调用Mutex.ReleaseMutex()方法释放这个对象,而在此期间,其他想要获取这个C# Mutex对象的线程都只有等待。

我们可以利用这个特性来控制一个应用程序只能运行一个实例。其他实例由于得不到这个Mutex而不能运行。

代码如下所示

 

private static Mutex s_Mutex = new Mutex();                     //互斥锁
public virtual bool RaiseSource(SourceParameter source, int MPluse = 1)
        {
            s_Mutex.WaitOne();
            try
            {
                short iPhaseFlag = GetPhaseFlag(source.MeterPhaseWire, source.WattVar);

                int iCount = 0;
                do
                {
                    try
                    {
                        string phaseStr = GetPhaseStr(source.Phase);

                        if (true == HSCOMWrp.Adjust_UI1(
                            iPhaseFlag,
                            source.RatingVoltage,
                            source.RatingCurrent,
                           source.StandMeterFrequency,
                            (short)source.PhaseOrder,
                            (short)source.Direct,
                            source.Volt_PerA,                                                       //实际电压比率
                            source.Volt_PerB,
                            source.Volt_PerC,
                            source.Curr_PerA,                                                       //实际电流比率
                            phaseStr,
                            source.FactorStr,
                            this.m_CalibratorParameter.StandardMeterType,
                            Dev_Port
                        ))
                        {
                            //当调用返回后源是稳定的吧?要么延迟少点(2-3秒即可)?
                            System.Threading.Thread.Sleep(this.m_CalibratorParameter.SteadyTime * 1000);
                            return true;
                        }
                    }
                    catch
                    {
                        System.Threading.Thread.Sleep(RETRY_DELAY_TIME);
                    }

                    System.Threading.Thread.Sleep(RETRY_DELAY_TIME);
                    iCount++;

                } while (iCount < RETRY_NUMBERS);

                return false;
            }
            finally
            {
                s_Mutex.ReleaseMutex();
            }
        }

此外还需说明一点,mutex的name是在系统中是唯一的,也就是上述代码中的Name,系统依靠这个name属性来标识唯一的Mutex。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值