2012-06-10 68 views
0

我將DotNetOpenAuth與Mono 2.10結合使用。當調用context.Application.Unlock()時,拋出異常,首先指示lock was never acquired。我修改了代碼,如下所示。Mono 2.10中的HttpApplicationState.Lock()

我的問題是,代碼是否服務於相同的目的,並且在Apache下單聲道甚至支持以這種方式鎖定?

原始

    context.Application.Lock(); 

        try 
        { 
         if ((store = (IRelyingPartyApplicationStore)context.Application[ApplicationStoreKey]) == null) 
         { 
          context.Application[ApplicationStoreKey] = store = new StandardRelyingPartyApplicationStore(); 
         } 
        } 
        finally 
        { 
         context.Application.UnLock(); 
        } 

我的修改

lock (app) 
       { 

        try 
        { 
         if ((store = (IRelyingPartyApplicationStore)context.Application[ApplicationStoreKey]) == null) 
         { 
          context.Application[ApplicationStoreKey] = store = new StandardRelyingPartyApplicationStore(); 
         } 
        } 
        finally 
        { 
         //context.Application.UnLock(); 
        } 
       } 

回答

1

其實是不一樣的覺得Application.Lock();lock(app)

Application.Lock();是鎖定在池中的所有線程, lock(app)只能鎖定當前的池線程。

如果您的應用程序數據有問題,請將它們保存在一個靜態變量中,然後您可以使用lock(),其速度更快,並由Microsoft建議。

更詳盡的資料讀取此相似的回答:https://stackoverflow.com/a/10964038/159270

順便說一句,這是的Application.Lock();

public void Lock() 
{ 
    this._lock.AcquireWrite(); 
} 

internal virtual void AcquireWrite() 
{ 
    lock (this) 
    { 
     while (this._lock != 0) 
     { 
      try 
      { 
       Monitor.Wait(this); 
       continue; 
      } 
      catch (ThreadInterruptedException) 
      { 
       continue; 
      } 
     } 
     this._lock = -1; 
    } 
} 
代碼