当前位置:  开发笔记 > 编程语言 > 正文

在C#中是否有"尝试锁定,跳过超时"操作?

如何解决《在C#中是否有"尝试锁定,跳过超时"操作?》经验,为你挑选了3个好方法。

我需要尝试锁定一个对象,如果它已经锁定只是继续(超时后,或没有它).

C#lock语句是阻塞的.



1> Derek Park..:

Ed为您提供了正确的功能.只是别忘了打电话Monitor.Exit().你应该使用一个try-finally块来保证正确的清理.

if (Monitor.TryEnter(someObject))
{
    try
    {
        // use object
    }
    finally
    {
        Monitor.Exit(someObject);
    }
}



2> Ed S...:

我相信你可以使用Monitor.TryEnter().

lock语句只转换为Monitor.Enter()调用和try catch块.



3> cwills..:

我有同样的问题,我最终创建了一个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..");
    }
}

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有