在我正在编写的这段代码中,另一个开发人员的库以固定的、预定的时间间隔触发我的对象的一个方法。我遇到了这样的问题:在到达另一个时间间隔时,对我的对象的方法的前一次调用还没有完成,并且对我的方法进行了第二次调用以再次执行-然后这两个线程结束了彼此的步进。我希望能够通过检查来包装该方法的实现,以查看它是否处于处理过程中,如果是,则跳过该块。
锁与我想要的类似,但不能完全覆盖它,因为锁将阻塞,一旦前一个实例释放锁,对我的方法的调用就会恢复。这不是我想要发生的事情,因为我可能会备份大量这样的调用,并等待一个接一个地处理。相反,我想要一些类似于锁的东西,但没有块,这样执行将在通常被锁包围的代码块之后继续执行。
我想出的是一个与Interlocked.Increment和Interlocked.Decrement一起使用的计数器,它允许我使用一个简单的if语句来确定方法上的执行是否应该继续。
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);
}
}我觉得我想得太多了,也许有一个更简单的解决方案。
发布于 2011-03-01 02:01:13
您可以调用Monitor.TryEnter并在它返回false时继续。
发布于 2011-03-01 02:49:15
public class Processor
{
private readonly object lockObject = new object();
public void PerformProcessing()
{
if (Monitor.TryEnter(lockObject) == true)
{
try
{
// Do something...
}
finally
{
Monitor.Exit(lockObject);
}
}
}
}发布于 2011-03-01 02:07:00
给对象添加一个标志怎么样?在该方法中,将标志设置为true,以指示该方法正在执行。在该方法的最后,将其重置为false。然后,您可以检查该标志的状态,以了解是否可以调用该方法。
https://stackoverflow.com/questions/5145682
复制相似问题