2011-07-08 25 views
3

我有一個Web服務可以凍結鎖定命令上的死鎖。鎖定關鍵字和應用程序重置

lock(typeof(MyServiceType)) 

我覺得這是由應用程序池重置造成的。

應用程序池重置是否有任何方式可能導致鎖成爲永久鎖?

+1

不要鎖定'Type'的實例!一般來說,你永遠不應該鎖定別人可以鎖定的東西。 – jason

回答

6

我無法準確評論與應用程序池重置有關的情況,但是也許您應該嘗試鎖定新對象,而不是?

private readonly object myLock = new object(); 

    void DoSomething() 
    { 
    lock(myLock) 
    { 
     ... 
    } 
    } 
+0

更正。謝謝Henk。 – Armbrat

1

不正常。

應用程序池是進程隔離的。唯一可以解決問題的方式是應用程序池由於死鎖而無法關閉。 (這將是一個DOS,因此可能是IIS中的一個錯誤。)

現在想起來了,真的,這可能是你的問題。您正在鎖定一個類型(類型的 MyServiceType)。你可以嘗試鎖定其他東西(這可能不會阻止從IIS中的AppDomain卸載包含程序集?)。類似以下的是慣用的:

public class MyServiceType : //.... 
{ 
     private static readonly Object _lockObject = new Object(); 

     // .... 

     lock(_lockObject) 
     { 
      .... 
     }