オブジェクトをロックしようとする必要があり、既にロックされている場合は続行します (タイムアウト後、またはそれなしで)。
C# の lock ステートメントがブロックされています。
オブジェクトをロックしようとする必要があり、既にロックされている場合は続行します (タイムアウト後、またはそれなしで)。
C# の lock ステートメントがブロックされています。
エドはあなたにぴったりの機能を持っています。電話することを忘れないでくださいMonitor.Exit()
。try-finally
適切なクリーンアップを保証するために、ブロックを使用する必要があります。
if (Monitor.TryEnter(someObject))
{
try
{
// use object
}
finally
{
Monitor.Exit(someObject);
}
}
使えると思いますMonitor.TryEnter()
。
lock ステートメントは、Monitor.Enter()
呼び出しとtry catch
ブロックに変換されるだけです。
私は同じ問題を抱えていました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;
}
}
}
次に、次の構文を使用してロックします。
var obj = new object();
using (var tryLock = new TryLock(obj))
{
if (tryLock.HasLock)
{
Console.WriteLine("Lock acquired..");
}
}
他の人が正しい方向を指し示したので、おそらく自分でこれを見つけるでしょうが、TryEnter はタイムアウト パラメーターを取ることもできます。
Jeff Richter の「CLR Via C#」は、CLR の内部構造の詳細について書かれた優れた本であり、より複雑なものに興味がある場合に役立ちます。