C#向新手解释互斥时间跨度
我对互斥是完全陌生的 我不明白这意味着什么: WaitOne(TimeSpan)阻塞当前线程,直到当前实例 接收信号,使用时间跨度指定时间间隔。 (继承自WaitHandle。) 例如,如果我使用:C#向新手解释互斥时间跨度,c#,multithreading,mutex,C#,Multithreading,Mutex,我对互斥是完全陌生的 我不明白这意味着什么: WaitOne(TimeSpan)阻塞当前线程,直到当前实例 接收信号,使用时间跨度指定时间间隔。 (继承自WaitHandle。) 例如,如果我使用: static void Main() { using(Mutex mutex = new Mutex(false, appGuid)) { if(!mutex.WaitOne(2000, false)) { MessageBox.Show("I
static void Main()
{
using(Mutex mutex = new Mutex(false, appGuid))
{
if(!mutex.WaitOne(2000, false))
{
MessageBox.Show("Instance already running");
return;
}
GC.Collect();
Application.Run(new Form1());
}
}
这是否意味着一旦
if(!mutex.WaitOne(2000, false))
如果触发,它将等待2秒钟,然后检查线程上是否有锁
?这意味着当前线程将阻塞,直到有人调用
mutex.ReleaseMutex()
或超过2000ms超时。如果达到超时,操作将返回false
有关方法调用的更多详细信息,请参见MSDN链接
因此,底线是不管您传递什么值作为超时,调用
mutex.ReleaseMutex()
无论如何都会立即释放线程-超时存在,这样调用就不会无限等待,以防互斥锁从未释放或在应用程序环境认为的延迟时间内释放。您是否意识到您给出的文档引用是用于与您编写的代码不同的方法?例如这个问题的目的是,布尔重载无论如何没有任何区别。Time参数用于定义超时,这是允许等待的最大时间WaitOne
将尝试在超时过期之前获得所有权,从“调用时立即”^^^开始,这很简单,您得到的代码完全错误。很确定你已经知道,要得到你需要的答案,要求一本手册并不是一个好办法。单实例应用程序已经得到了.NET Framework的很好支持,而不是自己的应用程序。因此,在经过的2000毫秒内,它是否会尝试(例如)x amount if times来查看互斥锁是否被释放?是的,类似于此,但这因操作系统而异。不幸的是,我没有足够的知识来告诉您Windows互斥体是如何实现的(.Net互斥体只是Windows互斥体的包装器),也许对核心Windows更感兴趣的人可以提供帮助。