0

DotNetOpenAuthをMono2.10と組み合わせて使用​​しています。context.Application.Unlock()が呼び出されると、最初からロックが取得されなかったことを示す例外がスローされます。以下のようにコードを変更しました。

私の質問は、コードは同じ目的を果たしますか、そしてApacheの下のmonoはこの方法でロックをサポートしますか?

オリジナル

                   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();
                    }
                }
4

1 に答える 1

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;
    }
}
于 2012-06-10T23:33:50.483 に答える