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

时间:2017-02-13 18:12:46

标签: c# multithreading

我的应用程序在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
}

我的方法是否正常,或者我可能在计数器中得到错误的值?

2 个答案:

答案 0 :(得分:0)

如果同时从多个线程调用,那么这不行。您有几种可能导致麻烦的竞争条件。考虑使用System.Thread.Interlocked.Increment来增加计数器。

如果你需要同时保护counter和firtTime,那么考虑这样的事情:

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
}

每当你在其他代码中弄乱计数器和firtTime时,一定要使用lock(sync){}

答案 1 :(得分:0)

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

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

counter ++被翻译成counter = counter + 1,包括读和写。因此需要使用Interlocked.Increment

进行原子化

对于计数器

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