C# 队列null值返回并引发NullReferenceException

C# 队列null值返回并引发NullReferenceException,c#,.net,nullreferenceexception,C#,.net,Nullreferenceexception,我有队列代码,但抛出NullReferenceException错误 public class BlockingQueue<T> { private Queue<T> _queue; private Semaphore _sem; public int Count { get { return this._queue.Count; } } publ

我有队列代码,但抛出
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();
    }
}
公共类阻止队列
{
专用队列;
专用信号量;
公共整数计数
{
得到
{
返回此。\u queue.Count;
}
}
公共T出列()
{
T;
这个;
锁定(此.\u队列)
{
t=这个。_queue.Dequeue();
}
返回t;
}
公共无效排队(T项)
{
//物品有适当的价值,但
//当队列的insert值为null时,我得到NRE
锁定(此.\u队列)
{
本._队列.排队(项目);
}
这个;
}
}
项有两个值,但在向队列插入值时_queuenull value返回错误

public class BlockingQueue
{
专用队列_Queue=新队列;
私有信号量_sem-=新信号量();
公共整数计数
{
得到
{
返回此。\u queue.Count;
}
}
公共T出列()
{
T;
这个;
锁定(此.\u队列)
{
t=这个。_queue.Dequeue();
}
返回t;
}
public void Enqueue(T item)/<=item有两个值,但当向队列插入值时_queuenull value返回错误
{
锁定(此.\u队列)
{
本._队列.排队(项目);
}
这个;
}
}

您的问题是初始化

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

表示线程安全的先进先出(FIFO)集合

这将是一个比您目前拥有的更为坚实的解决方案,并且有一些方法可以让您对队列进行更多的控制和控制

示例

 // 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);
//构造一个ConcurrentQueue。
ConcurrentQueue cq=新ConcurrentQueue();
//填充队列。
对于(int i=0;i<10000;i++)
{
排队(i);
}
//看一下第一个元素。
int结果;
如果(!cq.TryPeek(输出结果))
{
WriteLine(“CQ:TryPeek在本应成功时失败”);
}
否则如果(结果!=0)
{
WriteLine(“CQ:Expected TryPeek result为0,got{0}”,result);
}
int outerSum=0;
//使用ConcurrentQueue的操作。
动作动作=()=>
{                
int localSum=0;
int localValue;
而(cq.TryDequeue(out localValue))localSum+=localValue;
添加(参考outerSum、localSum);
};
//启动4个并发消费操作。
并行调用(动作,动作,动作,动作);
WriteLine(“outerSum={0},应该是49995000”,outerSum);

您忘记了初始化为了澄清这个答案,您的代码和这里的区别在于私有字段已经在这里初始化。仅定义字段不会创建对象的实例。非常感谢您的帮助!我更改了位私有队列_Queue=new Queue();私有信号量_sem=新信号量(1,2);谢谢你的帮助!这对我帮助很大!