C# 函数上的进程互斥
如何锁定函数,以阻止程序的其他实例执行它,直到它完成 我想我需要一个某种类型的系统互斥和一个WaitOne,但我不知道如何以一种健壮的方式将其组合在一起。我在想类似于C# 函数上的进程互斥,c#,windows,mutex,C#,Windows,Mutex,如何锁定函数,以阻止程序的其他实例执行它,直到它完成 我想我需要一个某种类型的系统互斥和一个WaitOne,但我不知道如何以一种健壮的方式将其组合在一起。我在想类似于 public static void function() { bool ok; using (Mutex mutex = new Mutex(true, "Set-IP Instance", out ok)) { if(!ok) {
public static void function()
{
bool ok;
using (Mutex mutex = new Mutex(true, "Set-IP Instance", out ok))
{
if(!ok)
{
mutex.WaitOne();
}
...
}
}
您正在寻找的行为可以通过以下代码实现(简单版本): 或者,如果您更喜欢可重用的方法:
public class MutexFactory
{
private string _name;
public MutexFactory(string name)
{
_name = name;
}
public SingleUseMutex Lock()
{
return new SingleUseMutex(_name);
}
}
public class SingleUseMutex : IDisposable
{
private readonly Mutex _mutex;
internal SingleUseMutex(string name)
{
_mutex = new Mutex(false, name);
_mutex.WaitOne();
}
public void Dispose()
{
_mutex.ReleaseMutex();
_mutex.Dispose();
}
}
可以这样使用:
private void TestFunction()
{
MutexFactory factory = new MutexFactory("YourMutexId");
for (int i = 0; i < 100; i++)
{
// also works for new instances of your program of course
new Thread(Interlocked).Start(factory);
}
}
private void Interlocked(object obj)
{
Guid guid = Guid.NewGuid();
MutexFactory factory = obj as MutexFactory;
using (factory.Lock())
{
Debug.WriteLine(guid.ToString("N") + " start");
//Waste Time
Thread.Sleep(50);
Debug.WriteLine(guid.ToString("N") + " end");
}
}
private void TestFunction()
{
MutexFactory工厂=新的MutexFactory(“您的MutexId”);
对于(int i=0;i<100;i++)
{
//当然,它也适用于程序的新实例
新螺纹(联锁)。启动(工厂);
}
}
私有空间联锁(对象obj)
{
Guid=Guid.NewGuid();
MutexFactory factory=obj作为MutexFactory;
使用(factory.Lock())
{
Debug.WriteLine(guid.ToString(“N”)+“start”);
//浪费时间
睡眠(50);
Debug.WriteLine(guid.ToString(“N”)+“end”);
}
}
的可能重复的lock
语句是否足以满足此要求?在类中和函数开头声明一个伪object pLock=new object()
,将所有内容包装在lock(pLock){/*../}
中。(). 低级互斥也应该可以工作。@MaximilianGerhardt No-lock只有在有多个线程运行时才能工作,而不是在同一个程序执行多个timesNo时,这不是为了防止同一程序的多个实例运行。这是为了防止多个实例同时运行同一个函数。上下文是我为一个硬件分配一个IP地址,用户可以同时插入多个,所以我需要确保分配唯一的地址。我想我应该锁定系统范围内设置IP的函数。“阻止程序的其他实例”不够清楚。您是否需要阻止其他实例在同一桌面、同一用户帐户、同一机器或全局上运行代码?
private void TestFunction()
{
MutexFactory factory = new MutexFactory("YourMutexId");
for (int i = 0; i < 100; i++)
{
// also works for new instances of your program of course
new Thread(Interlocked).Start(factory);
}
}
private void Interlocked(object obj)
{
Guid guid = Guid.NewGuid();
MutexFactory factory = obj as MutexFactory;
using (factory.Lock())
{
Debug.WriteLine(guid.ToString("N") + " start");
//Waste Time
Thread.Sleep(50);
Debug.WriteLine(guid.ToString("N") + " end");
}
}