队列空值 return 并抛出 NullReferenceException

Queue null value return and throws NullReferenceException

我有队列代码但抛出 NullReferenceException 错误。

public class BlockingQueue<T>
{
    private Queue<T> _queue;
    private Semaphore _sem;

    public int Count
    {
        get
        {
            return this._queue.Count;
        }
    }


    public T Dequeue()
    {
        T t;
        this._sem.WaitOne();
        lock (this._queue)
        {
            t = this._queue.Dequeue();
        }
        return t;
    }

    public void Enqueue(T item)  
    {
        // item have proper value but 
        // when insert value to Queue<T> _queue is null and I get NRE
        lock (this._queue)
        {
            this._queue.Enqueue(item);
        }
        this._sem.Release();
    }
}

项目有两个值,但是当将值插入队列时_queue 空值 return 错误

public class BlockingQueue<T>
{
    private Queue<T> _queue = new Queue<T>;
    private Semaphore _sem -= new Semaphore();

    public int Count
    {
        get
        {
            return this._queue.Count;
        }
    }


    public T Dequeue()
    {
        T t;
        this._sem.WaitOne();
        lock (this._queue)
        {
            t = this._queue.Dequeue();
        }
        return t;
    }

    public void Enqueue(T item)  // < = item have two value but when insert value to Queue<t> _queue null value return error
    {
        lock (this._queue)
        {
            this._queue.Enqueue(item);
        }
        this._sem.Release();
    }
}

你的问题是初始化。

但是,如果您正在尝试创建线程安全队列,我建议您尽可能使用 BCL (FIFO) 集合,所有艰苦的工作都已完成并为您测试。

ConcurrentQueue Class

Represents a thread-safe first in-first out (FIFO) collection.

这将是一个比您目前所拥有的解决方案更可靠的解决方案,并且具有可让您更好地控制和增强队列功能的方法。

例子

 // Construct a ConcurrentQueue.
  ConcurrentQueue<int> cq = new ConcurrentQueue<int>();

  // Populate the queue.
  for (int i = 0; i < 10000; i++)
  {
      cq.Enqueue(i);
  }

  // Peek at the first element.
  int result;
  if (!cq.TryPeek(out result))
  {
     Console.WriteLine("CQ: TryPeek failed when it should have succeeded");
  }
  else if (result != 0)
  {
     Console.WriteLine("CQ: Expected TryPeek result of 0, got {0}", result);
  }

  int outerSum = 0;
  // An action to consume the ConcurrentQueue.
  Action action = () =>
  {                
     int localSum = 0;
     int localValue;
     while (cq.TryDequeue(out localValue)) localSum += localValue;
     Interlocked.Add(ref outerSum, localSum);
  };

  // Start 4 concurrent consuming actions.
  Parallel.Invoke(action, action, action, action);

  Console.WriteLine("outerSum = {0}, should be 49995000", outerSum);