69

オブジェクトをロックしようとする必要があり、既にロックされている場合は続行します (タイムアウト後、またはそれなしで)。

C# の lock ステートメントがブロックされています。

4

5 に答える 5

109

エドはあなたにぴったりの機能を持っています。電話することを忘れないでくださいMonitor.Exit()try-finally適切なクリーンアップを保証するために、ブロックを使用する必要があります。

if (Monitor.TryEnter(someObject))
{
    try
    {
        // use object
    }
    finally
    {
        Monitor.Exit(someObject);
    }
}
于 2008-08-12T06:37:34.053 に答える
43

使えると思いますMonitor.TryEnter()

lock ステートメントは、Monitor.Enter()呼び出しとtry catchブロックに変換されるだけです。

于 2008-08-12T06:29:24.070 に答える
17

私は同じ問題を抱えていました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..");
    }
}
于 2014-05-19T00:22:30.267 に答える
3

他の人が正しい方向を指し示したので、おそらく自分でこれを見つけるでしょうが、TryEnter はタイムアウト パラメーターを取ることもできます。

Jeff Richter の「CLR Via C#」は、CLR の内部構造の詳細について書かれた優れた本であり、より複雑なものに興味がある場合に役立ちます。

于 2008-08-12T07:54:39.607 に答える