C#中Mutex的用法

456 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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();
        }
    }`