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