我真的锁定了这个东西

时间:2011-07-11 13:26:02

标签: c# .net multithreading thread-safety

环境: 3个Web服务2位于不同应用程序池中的同一个池1中。

他们都有相同的代码试图访问非线程安全的东西,比如他们写的文件。

我尝试以相同的方式为每个Web服务锁定此代码。我不确定lock关键字是否正在执行我想要的操作。

我试过的一个锁就是每个网络服务:

string stringValue
lock (stringValue)

我尝试的另一个锁是:

lock (typeof(MyWebServiceClass))

这些锁会阻止在文件使用时同时写入文件吗?在这种情况下,有多个客户端点击这些Web服务。

2 个答案:

答案 0 :(得分:10)

您需要一个名为Mutex来锁定应用程序池/进程:

C#lock关键字是Monitor.Enter()块中Monitor.Exit()try/finally方法调用的语法糖。 Monitor是一个轻量级(完全托管)同步原语,用于进程内锁定。

另一方面,Mutex可以是本地的或全局的(跨同一台机器上的进程) - 全局互斥锁,也称为命名互斥锁,在整个操作系统中都可见,并可用于同步多个应用程序域或进程中的线程。另请参阅MSDN

答案 1 :(得分:2)

我认为您需要使用Mutex来锁定AppDomains。

另外,为了它的价值,避免锁定类型。如果代码在其他地方尝试在获得第一个锁之后锁定,则通常会导致死锁。最好锁定一个唯一目的是充当锁的对象。

例如:

object padlock;

lock(padlock)
{
   // work here
}