0

我将 DotNetOpenAuth 与 Mono 2.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(), 并且它更快并且由微软建议。

有关更多详细信息,还请阅读类似的答案: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 回答