使用
假设我们有以下内容:
整个系统是否应该被锁定,如下所示:
或者,只管理输入,并将“入侵者”踢出,像这样:
System.Threading.Timer
会从 ThreadPool
中衍生出线程,这意味着如果定时器的执行间隔在先前请求的顺序中仍有线程在处理,则同一回调将被委派到另一个线程上执行。除非回调是可重入感知的,否则这显然会在大多数情况下引起问题,但我想知道如何以最佳(即安全)方式解决它。假设我们有以下内容:
ReaderWriterLockSlim OneAtATimeLocker = new ReaderWriterLockSlim();
OneAtATimeCallback = new TimerCallback(OnOneAtATimeTimerElapsed);
OneAtATimeTimer = new Timer(OneAtATimeCallback , null, 0, 1000);
整个系统是否应该被锁定,如下所示:
private void OnOneAtATimeTimerElapsed(object state)
{
if (OneAtATimeLocker.TryEnterWriteLock(0))
{
//get real busy for two seconds or more
OneAtATimeLocker.ExitWriteLock();
}
}
或者,只管理输入,并将“入侵者”踢出,像这样:
private void OnOneAtATimeTimerElapsed(object state)
{
if (!RestrictOneAtATime())
{
return;
}
//get real busy for two seconds or more
if(!ReleaseOneAtATime())
{
//Well, Hell's bells and buckets of blood!
}
}
bool OneAtATimeInProgress = false;
private bool RestrictToOneAtATime()
{
bool result = false;
if (OneAtATimeLocker.TryEnterWriteLock(0))
{
if(!OneAtATimeInProgress)
{
OneAtATimeInProgress = true;
result = true;
}
OneAtATimeLocker.ExitWriteLock();
}
return result;
}
private bool ReleaseOneAtATime()
{
bool result = false;
//there shouldn't be any 'trying' about it...
if (OneAtATimeLocker.TryEnterWriteLock(0))
{
if(OneAtATimeInProgress)
{
OneAtATimeInProgress = false;
result = true;
}
OneAtATimeLocker.ExitWriteLock();
}
return result;
}
第一种方法因为锁定整个方法是否会有性能影响?
第二种方法是否真的提供了所谓的安全性 - 我是否遗漏了什么?
还有其他可靠且最好的方法吗?