HttpApplicationState.Lock() in Mono 2.10

本文关键字:Mono in Lock HttpApplicationState | 更新日期: 2023-09-27 18:36:39

我正在将DotNetOpenAuth与Mono 2.10结合使用。 当上下文。调用 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();
                    }
                }

HttpApplicationState.Lock() in Mono 2.10

实际上与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;
    }
}