锁定任何实例的代码的一部分

时间:2015-04-18 13:03:58

标签: c# reflection locking

我可以为任何实例锁定部分代码吗?

考虑这个

public bool method1()
{
    lock (this)
    {
        Thread.Sleep(15000);
        return true;
    }
}

然后在第一个项目中我称之为:

Assembly testAssembly = Assembly.LoadFile(@"C:\UsersLockTest\ClassLibrary1\bin\Debug\ClassLibrary1.dll");
Type calcType = testAssembly.GetType("ClassLibrary1.Class1");
object calcInstance = Activator.CreateInstance(calcType);

var x = (bool)calcType.InvokeMember("method1",BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,null, calcInstance, null);
Console.WriteLine("First project   " + x);
Console.ReadLine();

然后在第二个项目中,我将其称为上面。

有没有办法为任何实例锁定method1()?我的意思是第一个项目调用method1然后第二个Project调用它。第二个项目必须等到第一个项目通过锁定。

1 个答案:

答案 0 :(得分:2)

  

有没有办法为任何实例锁定method1()?

是。如果你创建lock使用静态对象的对象,它将在该类型的任何实例中查找它,而不是实例:

private static object globalLock = new object();

public bool Method1()
{
    lock (globalLock)
    {
        Thread.Sleep(15000);
        return true;
    }
}

请注意,通常,锁定this实例被认为是不好的做法,因为您无法知道哪些其他对象正在使用您的对象作为锁定机制。这就是为什么通常首选拥有一个用作锁的本地自包含对象。

根据MSDN documentationWhy is lock(this) {...} bad?更多信息。