gil*_*gil 58 c# multithreading locking
我需要尝试锁定一个对象,如果它已经锁定只是继续(超时后,或没有它).
C#lock语句是阻塞的.
Der*_*ark 95
Ed为您提供了正确的功能.只是别忘了打电话Monitor.Exit().你应该使用一个try-finally块来保证正确的清理.
if (Monitor.TryEnter(someObject))
{
try
{
// use object
}
finally
{
Monitor.Exit(someObject);
}
}
Run Code Online (Sandbox Code Playgroud)
cwi*_*lls 13
我有同样的问题,我最终创建了一个TryLock实现IDisposable 的类,然后使用该using语句来控制锁的范围:
public class TryLock : IDisposable
{
private object locked;
public bool HasLock { get; private set; }
public TryLock(object obj)
{
if (Monitor.TryEnter(obj))
{
HasLock = true;
locked = obj;
}
}
public void Dispose()
{
if (HasLock)
{
Monitor.Exit(locked);
locked = null;
HasLock = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下语法锁定:
var obj = new object();
using (var tryLock = new TryLock(obj))
{
if (tryLock.HasLock)
{
Console.WriteLine("Lock acquired..");
}
}
Run Code Online (Sandbox Code Playgroud)