我有一個Web服務可以凍結鎖定命令上的死鎖。鎖定關鍵字和應用程序重置
lock(typeof(MyServiceType))
我覺得這是由應用程序池重置造成的。
應用程序池重置是否有任何方式可能導致鎖成爲永久鎖?
我有一個Web服務可以凍結鎖定命令上的死鎖。鎖定關鍵字和應用程序重置
lock(typeof(MyServiceType))
我覺得這是由應用程序池重置造成的。
應用程序池重置是否有任何方式可能導致鎖成爲永久鎖?
我無法準確評論與應用程序池重置有關的情況,但是也許您應該嘗試鎖定新對象,而不是?
private readonly object myLock = new object();
void DoSomething()
{
lock(myLock)
{
...
}
}
更正。謝謝Henk。 – Armbrat
不正常。
應用程序池是進程隔離的。唯一可以解決問題的方式是應用程序池由於死鎖而無法關閉。 (這將是一個DOS,因此可能是IIS中的一個錯誤。)
現在想起來了,真的,這可能是你的問題。您正在鎖定一個類型(類型的 MyServiceType)。你可以嘗試鎖定其他東西(這可能不會阻止從IIS中的AppDomain卸載包含程序集?)。類似以下的是慣用的:
public class MyServiceType : //....
{
private static readonly Object _lockObject = new Object();
// ....
lock(_lockObject)
{
....
}
不要鎖定'Type'的實例!一般來說,你永遠不應該鎖定別人可以鎖定的東西。 – jason