首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中是否有“尝试锁定,如果超时跳过”操作?

在C#中是否有“尝试锁定,如果超时跳过”操作?
EN

Stack Overflow用户
提问于 2008-08-12 06:19:39
回答 5查看 29.4K关注 0票数 69

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

C# lock语句正在阻塞。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-08-12 06:29:24

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

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

票数 43
EN

Stack Overflow用户

发布于 2008-08-12 06:37:34

艾德为你准备了合适的功能。别忘了给Monitor.Exit()打电话。您应该使用try-finally块来保证正确的清理。

代码语言:javascript
复制
if (Monitor.TryEnter(someObject))
{
    try
    {
        // use object
    }
    finally
    {
        Monitor.Exit(someObject);
    }
}
票数 109
EN

Stack Overflow用户

发布于 2014-05-19 08:22:30

我也遇到了同样的问题,我最终创建了一个实现IDisposable的类TryLock,然后使用using语句来控制锁的范围:

代码语言:javascript
复制
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;
        }
    }
}

然后使用以下语法锁定:

代码语言:javascript
复制
var obj = new object();

using (var tryLock = new TryLock(obj))
{
    if (tryLock.HasLock)
    {
        Console.WriteLine("Lock acquired..");
    }
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档