标签:Threading C# System 用法 source 线程 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。
钢铁堡垒 发布了16 篇原创文章 · 获赞 10 · 访问量 4万+ 私信 关注标签:Threading,C#,System,用法,source,线程,Mutex 来源: https://blog.csdn.net/beautifull001/article/details/104531208
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。