非托管代码回调-方法调用计数



我的应用程序在C#中有一个方法,由相机驱动程序调用。未标记的代码,它是使用委托注册的。每次调用此方法时,我都要计数。

样品:

bool firtTime;
uint counter;
//firtTime is reseted (set to true) in another method.
private void MyMethod()
{
if (firtTime)
{
counter = 0;
firtTime = false;
}
counter++;
//Do stuff
}

我的方法可以吗?或者我可能在计数器中得到错误的值?

如果这是从多个线程同时调用的,那么这是不好的。您有几个竞争条件,可能会造成麻烦。请考虑使用System.Thread.Interlocked.Increment来递增计数器。

如果你需要保护计数器和第一时间,那么考虑一下这样的东西:

bool firtTime;
uint counter;
object sync = new object();
//firtTime is reseted (set to true) in another method.
private void MyMethod()
{
lock (sync) {
if (firtTime)
{
counter = 0;
firtTime = false;
}
counter++;
}
//Do stuff
}

请务必使用锁(同步){}每当干扰计数器和其他代码中的第一时间

static int counter = 0;
private void MyMethod()
{
Interlocked.Increment(ref counter);
//Do stuff
}

静态变量与类型而非对象相关联;

counter++被转换为counter=counter+1,即读取和写入。因此需要使用Interlocked.增量

对于计数器

var myCounter = counter == 0 ? 0 : (counter - 1);

最新更新