我的应用程序在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
}
我的方法是否正常,或者我可能在计数器中得到错误的值?
答案 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);