我正在检查这段代码,它正在执行类似于SyncLock的操作,但其他线程没有等待,而是跳过了代码。
代码是用变量来实现的;我想知道是否有一个内置的.net函数可以做到这一点?
Private _previousValueCount As Integer = 0
Private Sub F()
If _previousValueCount = 0 Then
_previousValueCount = 1
' ...
_previousValueCount = 0
End If
End Sub
有很多方法;一种方法是做一些类似的事情:
int lockTaken = 0;
...
bool haveLock = false;
try {
haveLock = Interlocked.CompareExchange(ref lockTaken, 1, 0) == 0;
if(haveLock) {
// it was zero, it is now one; you won the lock: do something
}
} finally {
if(haveLock) Interlocked.Exchange(ref lockTaken, 0);
}
另一种方法是使用超时为零的Monitor.TryEnter
:
readonly object syncLock = new object();
...
bool haveLock = false;
try {
Monitor.TryEnter(syncLock, 0, ref haveLock);
if(haveLock) {
// you won it; do something
}
} finally {
if(haveLock) Monitor.Exit(syncLock);
}
您可以使用Monitor类,该类试图获取任何类型的全局对象的锁。如果在某个时间跨度/毫秒内未获得锁定,则可以根据需要执行操作。
bool acquiredLock = false;
try
{
Monitor.TryEnter(lockObject, 1000, ref acquiredLock);
if (acquiredLock)
{
// got lock, do something
}
else
{
// no lock - warning/error/...
}
}
finally
{
if (acquiredLock)
Monitor.Exit(lockObject); // release lock!
}