使用命名的互斥锁在appdomains之间进行同步

时间:2014-02-01 04:05:07

标签: c# multithreading

我想在2个appdomains之间进行同步,但无法使其正常工作。

我有这个:

static void Main(string[] args)
{
    using (Mutex m = new Mutex(true, "Global\\m"))
    {
        AppDomain ad = AppDomain.CreateDomain("ad");
        var dllName = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
        ad.CreateInstanceFrom(dllName, typeof(Consumer).FullName);

        Thread.Sleep(4000);
        m.ReleaseMutex();
    }

    Console.ReadLine();
}

public class Consumer
{
    public Consumer()
    {
        //var createdNew = false;
        //Mutex m = new Mutex(false, "Global\\m", out createdNew);
        Mutex m = Mutex.OpenExisting("Global\\m");
        m.WaitOne();
        Console.WriteLine("Done");
    }
}

我希望在4秒后打印“完成”,但它会立即打印出来。

我尝试使用构造函数和使用OpenExisting在使用者中创建互斥体 - 没有任何区别。 不要认为命名互斥体“全局”在这种情况下有所不同,但也尝试过。

要丢失一些东西,我无法弄清楚是什么......帮忙?

1 个答案:

答案 0 :(得分:2)

互斥锁由一个线程拥有,它们是递归的,即可以在同一个线程上再次输入。使用互斥锁排除其他线程同时访问同一资源。你所做的就是创建一个由调用线程拥有的互斥锁,然后等待它。由于线程已拥有互斥锁,WaitOne会立即返回。

要查看延迟,您必须在另一个主题上调用OpenExistingWaitOne。出于演示目的,您可以尝试:

public Consumer()
{
    Task.Run(() => {
        Mutex m = Mutex.OpenExisting("Global\\m");
        m.WaitOne();
        Console.WriteLine("Done");
    });
}