队列空值 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) 集合,所有艰苦的工作都已完成并为您测试。
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);
我有队列代码但抛出 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();
}
}
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) 集合,所有艰苦的工作都已完成并为您测试。
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);