C# 函数上的进程互斥

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) {

如何锁定函数,以阻止程序的其他实例执行它,直到它完成

我想我需要一个某种类型的系统互斥和一个WaitOne,但我不知道如何以一种健壮的方式将其组合在一起。我在想类似于

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");   
    }
}