【问题标题】:HttpApplicationState.Lock() in Mono 2.10Mono 2.10 中的 HttpApplicationState.Lock()
【发布时间】:2012-06-10 21:05:41
【问题描述】:

我将 DotNetOpenAuth 与 Mono 2.10 结合使用。当调用 context.Application.Unlock() 时,首先抛出一个异常,指示 lock was never acquired。我已经修改了代码,如下所示。

我的问题是,代码是否具有相同的目的,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();
                    }
                }

【问题讨论】:

    标签: c# asp.net .net mono dotnetopenauth


    【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      相关资源
      最近更新 更多