我正在查看此代码,并且执行类似于SyncLock 的操作,但不是等待其他线程,而是跳过代码。
代码是用变量做的;我想知道是否有一个内置的.net函数可以做到这一点吗?
Private _previousValueCount As Integer = 0
Private Sub F()
If _previousValueCount = 0 Then
_previousValueCount = 1
' ...
_previousValueCount = 0
End If
End Sub
答案 0 :(得分:2)
有很多方法可以做到这一点;一种方法是做一些事情:
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);
}
答案 1 :(得分:1)
您可以使用 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!
}