2016-08-31 1 views
0

Ich bin in Schwierigkeiten, ich habe einen Zyklus, der alle fast 200ms ausgeführt wurde und 2 Arrays bevölkern, eine ist eine Kopie der alten achivied, die andere ist die neue. HierArray-Kopie für einen Thread C#

ist der Zyklus Code:

private byte[] _oldBuffer; 
private byte[] _newBuffer; 

private void Cycle() 
{ 
    while(exitCondition) 
    { 
    //do other stuff that not involved _newBuffer or _oldBuffer 
    GetNewBuffer() 
    //other stuff that not involved _newBuffer or _oldBuffer too 
    Thread.Sleep(200); //or more, minimum 200 
    } 
} 

private void GetNewBuffer() 
{ 
     _oldBuffer = _newBuffer; 

     //retrieve from PLC the new buffer 
     _newBuffer = RetrieveNewBuffer(); 

     Thread checkDifference = new Thread(() => MethodToCall.Start(_oldBuffer, _newBuffer)); 
     checkDifference.Start(); 

} 

Und hier ist es die von dem Thread ausgeführt Methode

public static void Start(byte[] oldBuffer, byte[] newBuffer) 
{ 
    for(int i = 0; i < oldBuffer.Lenght; i++) 
    { 
     //here happens that the two buffer are equal even if at starting the process they weren't 
     //they could be equal from a read to another, not always something change every 200ms 
     if(oldBuffer[i] != newBuffer[i]) 
      //value has change, handle method 
    }   
} 

Mein Problem ist, dass in der nächsten Lese Ich werde überschreiben _oldBuffer und _newBuffer , und der Thread fängt sie modifiziert und wird keinen Unterschied finden (oder zumindest ist das, was ich von der Fehlersuche erfasse) von den zwei, nicht mehr verschiedenen, Arrays.

Irgendwelche Vorschläge?

Vielen Dank im Rat an all

+6

Das sieht wie Pseudo-Code für mich aus ... bitte geben Sie eine [MCVE]. (Ich würde auch sehr empfehlen, folgenden .NET-Namenskonventionen zu folgen ...) –

+1

Die einfachste Lösung besteht darin, eine Kopie der Puffer an die Thread-Methode zu übergeben. Aber das wäre wahrscheinlich langsamer als nur einen blockierenden Aufruf der Methode zu machen (es sei denn, die Methode ist relativ langsam). –

+1

Minor Code-Stil Nitpick - diese Unterstriche sind schrecklich_for_readability. Eine signifikante Anzahl von Lesern würde bevorzugen, dass Sie * camelCase * verwenden. http://c2.com/cgi/wiki?CamelCase Ich kann das Visual Studio Stylecop Plugin sehr empfehlen. Es hat meinen Code wirklich verbessert. – Gusdor

Antwort

0

ich mit Array.Copy versucht() und es funktioniert, wird die Anordnung nicht verändert wird. Etwas wie das:

private void GetNewBuffer_ArrayCopy() 
{ 
     _oldBuffer = _newBuffer; 
     _newBuffer = RetrieveNewBuffer(); 

     byte[] localOldBuffer = new byte[_oldBuffer]; 
     Array.Copy(_oldBuffer, localOldBuffer, 0); 
     byte[] localNewBuffer = new byte[_oldBuffer]; 
     Array.Copy(_newBuffer, localNewBuffer, 0); 

     Thread checkDifference = new Thread(() => MethodToCall.Start(localOldBuffer, localNewBuffer)); 
     checkDifference.Start(); 

}