我正在检查这段代码,它是在执行类似于SyncLock的操作,但是它们跳过了代码,而不是等待的其他线程。
代码是用变量来实现的;我想知道是否有一个内置的.net函数可以做到这一点?
Private _previousValueCount As Integer = 0
Private Sub F()
If _previousValueCount = 0 Then
_previousValueCount = 1
' ...
_previousValueCount = 0
End If
End Sub发布于 2012-08-28 19:27:34
您可以使用监视器类,它试图获取上的一个锁--任何类型的全局对象。如果在某个时间段/毫秒内没有获得锁,则可以随意操作。
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!
}发布于 2012-08-28 19:24:35
做这件事有很多种方法,其中一种方法是做以下事情:
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);
}https://stackoverflow.com/questions/12166072
复制相似问题