我想在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在使用者中创建互斥体 - 没有任何区别。 不要认为命名互斥体“全局”在这种情况下有所不同,但也尝试过。
要丢失一些东西,我无法弄清楚是什么......帮忙?
答案 0 :(得分:2)
互斥锁由一个线程拥有,它们是递归的,即可以在同一个线程上再次输入。使用互斥锁排除其他线程同时访问同一资源。你所做的就是创建一个由调用线程拥有的互斥锁,然后等待它。由于线程已拥有互斥锁,WaitOne
会立即返回。
要查看延迟,您必须在另一个主题上调用OpenExisting
和WaitOne
。出于演示目的,您可以尝试:
public Consumer()
{
Task.Run(() => {
Mutex m = Mutex.OpenExisting("Global\\m");
m.WaitOne();
Console.WriteLine("Done");
});
}