2016-11-30 4 views
0

Je suis en train de développer une classe C# dans laquelle on m'attribue un buffer de tableau, et chaque fois qu'un événement se déclenche, je remplis l'élément suivant dans mon tableau. Ainsi, par exemple:Comment garantir l'ordre chronologique de la copie d'éléments dans un tableau dans C#/.NET en utilisant des événements?

class MyClass 
{ 
    private int[] buffer = new int[10]; 
    private int index = 0; 

    public void EventFired(object sender, IntEventArgs e) 
    { 
     buffer[index] = e.Integer; 
     index++; 
    } 
} 

Si j'ai plusieurs événements qui licencient au sein de la succession rapide d'une autre, par exemple tous 0,5-1,0 ms, va EventFired remplir le tableau dans l'ordre que les événements ont été tirés? Et si au lieu de stocker un entier à chaque fois que l'événement se déclenche, je stockais 2.000 ou 10.000 entiers? Dois-je m'inquiéter des conditions de course? Je ne suis pas si familier avec le fonctionnement interne de C# /. NET, donc nous aimerions des conseils sur la façon de garantir que nous peupler buffer dans le même ordre dans lequel les événements ont tiré chronologiquement.

+0

Vous devriez vous inquiéter des conditions de course. Si j'étais vous j'utiliserais 'lock'. –

+0

jetez un oeil sur ces pages: http://stackoverflow.com/questions/786383/c-sharp-events-and-thread-safety et http://stackoverflow.com/questions/16216400/c-sharp-events- execution-are-thread-safe –

+2

Tous vos événements sont déclenchés uniquement à partir du thread UI ou de plusieurs threads d'arrière-plan? – 3615

Répondre

0

Si vous utilisez un ConcurrentQueue<int>, vous aurez une solution «premier entré, premier sorti» qui est sûre pour les threads.