超时后C#自动释放锁定

时间:2011-03-07 17:03:58

标签: c# locking

有没有人对什么是最好的实现锁定的方法有任何想法,以便在X秒后自动释放?

4 个答案:

答案 0 :(得分:3)

假设您正在寻找在X秒内触发的事件,那么我认为没有任何核心Mutex对象,它目前提供您正在寻找的功能类型。

您可以使用System.Timer(在X秒内触发并释放锁定的互斥锁)或使用睡眠时间为X秒的线程创建此类功能 - 我更喜欢第一种方法。

但是,这两个都将安排在用户/应用程序层中 - 因此您必须等待它们被安排。

答案 1 :(得分:2)

您可以使用Monitor.TryEnter来实现此目的。请参考下面 -

Synchronization problems with Monitor class in WCF service

if(Monitor.TryEnter(lockObj, timeout)) {
    try {
        ...
    } finally {
        Monitor.Exit(lockObj);
    }
}

答案 2 :(得分:0)

在Web开发中,我一直缓存滑动超时。也许您可以使用缓存对象作为锁?

以下是非Web应用程序中缓存技术的讨论:

Caching in C# without System.Web

答案 3 :(得分:0)

您可以将TransactionScope与TransactionOptions超时参数一起使用。

using (TransactionScope tx = new TransactionScope(TransactionScopeOption.RequiresNew,
                    new TransactionOptions() { Timeout = new TimeSpan(0, 0, 10) }))

时间结束后,您将收到TransactionAbortedException,并且应该释放该锁。

会像这样:

lock(_lock)
{
    try
    {
        using (TransactionScope tx = new TransactionScope(TransactionScopeOption.RequiresNew,
                        new TransactionOptions() { Timeout = new TimeSpan(0, 0, 10) }))
        {
            //do somenting important stuff
            tx.Complete();
            tx.Dispose();  // just remembering that will be disposed.
        }
    }
    catch (TransactionAbortedException tex)
    {
        throw new Exception("Operation Timeout");
    }
    catch (Exception)
    {
        throw; // do whatever you want
    }
}