环境: 3个Web服务2位于不同应用程序池中的同一个池1中。
他们都有相同的代码试图访问非线程安全的东西,比如他们写的文件。
我尝试以相同的方式为每个Web服务锁定此代码。我不确定lock关键字是否正在执行我想要的操作。
我试过的一个锁就是每个网络服务:
string stringValue
lock (stringValue)
我尝试的另一个锁是:
lock (typeof(MyWebServiceClass))
这些锁会阻止在文件使用时同时写入文件吗?在这种情况下,有多个客户端点击这些Web服务。
答案 0 :(得分:10)
您需要一个名为Mutex
来锁定应用程序池/进程:
C#lock
关键字是Monitor.Enter()
块中Monitor.Exit()
,try/finally
方法调用的语法糖。 Monitor
是一个轻量级(完全托管)同步原语,用于进程内锁定。
另一方面,Mutex
可以是本地的或全局的(跨同一台机器上的进程) - 全局互斥锁,也称为命名互斥锁,在整个操作系统中都可见,并可用于同步多个应用程序域或进程中的线程。另请参阅MSDN。
答案 1 :(得分:2)
我认为您需要使用Mutex来锁定AppDomains。
另外,为了它的价值,避免锁定类型。如果代码在其他地方尝试在获得第一个锁之后锁定,则通常会导致死锁。最好锁定一个唯一目的是充当锁的对象。
例如:
object padlock;
lock(padlock)
{
// work here
}