Brunet.Concurrent.BlockingQueue.Enqueue C# (CSharp) Method

Enqueue() public method

public Enqueue ( object a ) : int
a object
return int
  public override int Enqueue(object a) {
    bool close = false;
    int count = -1;
    lock( _sync ) {
      if( _max_enqueues > 0 && _enqueues >= _max_enqueues ) {
        //No good:
        throw new InvalidOperationException("Maximum number of Enqueues exceeded");
      }
      if( _closed == 0 ) {
        _queue.Enqueue(a);
        _enqueues++;
        _count++;
        count = _count;
        close = (_enqueues == _max_enqueues);
      }
      else {
        //We are closed, ignore all future enqueues.
        throw new InvalidOperationException("BlockingQueue is closed, Enqueue failed");
      }
      //Wake up any waiting threads
#if BRUNET_DEBUG
      Console.Error.WriteLine("Enqueue set: count {0}", Count);
#endif
    }
    //If we just went from 0 -> 1 signal any waiting Dequeue
    if( count == 1 ) { 
      SetOrCloseRE(true, false);
    }
    //After we have alerted any blocking threads (Set), fire
    //the event:
    FireEnqueue();
    if( close ) {
      Close();  
    }
    return count;
  }

Usage Example

Example #1
0
            public void Start()
            {
                Random r = new Random();

                for (int i = 0; i < _runs; i++)
                {
                    int rn = r.Next();
                    _q.Enqueue(rn);
                    lock ( _list ) {
                        _list.Add(rn);
                    }
                }
            }