.net 某种同步锁
我正在签出这段代码,它正在做一些类似于同步锁的事情,但是其他线程没有等待,而是跳过了代码 代码是用变量实现的;我想知道是否有一个内置的.net函数可以做到这一点.net 某种同步锁,.net,vb.net,multithreading,.net,Vb.net,Multithreading,我正在签出这段代码,它正在做一些类似于同步锁的事情,但是其他线程没有等待,而是跳过了代码 代码是用变量实现的;我想知道是否有一个内置的.net函数可以做到这一点 Private _previousValueCount As Integer = 0 Private Sub F() If _previousValueCount = 0 Then _previousValueCount = 1 ' ... _previousValueCount = 0
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);
}
您可以使用类,该类尝试获取对任何类型的全局对象的锁定。如果在特定的时间间隔/毫秒内未获得锁,则可以根据需要执行操作
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!
}
顺便说一句,该代码不是线程安全的;这与我发布的Interlocked
版本基本相同,但区别在于Interlocked
是线程安全的