2017-02-13 40 views
0

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

是我的方法確定或可能我在櫃檯得到錯誤的價值觀?

+1

這是一個實例方法,所以它也將它從同一個實例調用的時候。如果你有另一個實例計數器是不同的 – Steve

+1

爲什麼你不使用靜態變量與Interlocked.Increment – brykneval

+0

你可以去靜態變量,不需要if塊,我猜。 – Prajwal

回答

0

如果這是從多個線程同時調用,那麼這是不好的。你有幾種可能導致麻煩的競賽條件。考慮使用System.Thread.Interlocked.Increment增加計數器。

如果你需要同時保護計數器和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在你的其他代碼搞亂

+0

它被相機驅動程序調用,我認爲它應該是一個單線程,這就是爲什麼我沒有使用鎖。但是我得到了一些奇怪的結果,我試圖找出原因。 – Pedro77

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

靜態變量與類型而不是對象相關聯;

將計數器++轉換爲計數器=計數器+ 1,既是讀取又是寫入。所以必須原子性Interlocked.Increment

對於計數器

var myCounter = counter == 0 ? 0 : (counter - 1); 
相關問題