首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中有没有类似于锁的构造,可以跳过代码块而不是阻塞?

在C#中有没有类似于锁的构造,可以跳过代码块而不是阻塞?
EN

Stack Overflow用户
提问于 2011-03-01 01:59:16
回答 3查看 164关注 0票数 3

在我正在编写的这段代码中,另一个开发人员的库以固定的、预定的时间间隔触发我的对象的一个方法。我遇到了这样的问题:在到达另一个时间间隔时,对我的对象的方法的前一次调用还没有完成,并且对我的方法进行了第二次调用以再次执行-然后这两个线程结束了彼此的步进。我希望能够通过检查来包装该方法的实现,以查看它是否处于处理过程中,如果是,则跳过该块。

锁与我想要的类似,但不能完全覆盖它,因为锁将阻塞,一旦前一个实例释放锁,对我的方法的调用就会恢复。这不是我想要发生的事情,因为我可能会备份大量这样的调用,并等待一个接一个地处理。相反,我想要一些类似于锁的东西,但没有块,这样执行将在通常被锁包围的代码块之后继续执行。

我想出的是一个与Interlocked.Increment和Interlocked.Decrement一起使用的计数器,它允许我使用一个简单的if语句来确定方法上的执行是否应该继续。

代码语言:javascript
复制
public class Processor
{
    private long _numberOfThreadsRunning = 0;

    public void PerformProcessing()
    {
        long currentThreadNumber Interlocked.Increment(ref _numberOfThreadsRunning);
        if(currentThreadNumber == 1)
        {
            // Do something...
        }
        Interlocked.Decrement(ref _numberOfThreadsRunning);
    }
}

我觉得我想得太多了,也许有一个更简单的解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-01 02:01:13

您可以调用Monitor.TryEnter并在它返回false时继续。

票数 7
EN

Stack Overflow用户

发布于 2011-03-01 02:49:15

代码语言:javascript
复制
public class Processor
{
    private readonly object lockObject = new object();

    public void PerformProcessing()
    {
        if (Monitor.TryEnter(lockObject) == true)
        {
            try
            {
                // Do something...
            }
            finally
            {
                Monitor.Exit(lockObject);
            }
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2011-03-01 02:07:00

给对象添加一个标志怎么样?在该方法中,将标志设置为true,以指示该方法正在执行。在该方法的最后,将其重置为false。然后,您可以检查该标志的状态,以了解是否可以调用该方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5145682

复制
相关文章

相似问题

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