I have a list of objects (musical notes) that is enumerated on a separate thread as they are played. I am doing this so that I can keep the UI thread responsive.
whilst a note is playing (as part of an enumeration) how can I allow for the fact that a new note may of been added to the List (without the obvious collection modified exception).
I know I could copy the list to a temporary list and enumerate that, but I actually want the list to grow as a user selects more (and this will happen whilst the first note is playing etc).
psuedo logic as is:
onClick()
{
Queue.Add(theClickedNote)
Queue.Play() <-- on another thread
}
Play()
{
if(Playing==true){return ;}
foreach(note theNote in Queue)
{
Note.Play();
Queue.Remove(theNote);
}
}
As you can see in the above, each Click event adds a note to the Queue and then invokes a play method on the queue.
the queue enumerates the notes and plays each one in turn before removing the note
I hope I have explained what I am trying to do clearly?
Something like this can be used with
ConcurrentQueue<T>in .Net 4.ConcurrentQueue is thread-safe, so no locking needs to be implemented.