队列出栈的数据和入栈数据不一样,晕死!
发上代码,功能是把数据入栈,一个线程把数据一个一个弹出栈处理。代码如下,可是在事件里面写代码竟然跟入栈的数据不一样,很多入栈的数据成员变成NULL了,高手帮帮忙!
public class QueuedDataProcessor<T> where T : class
{
private bool stop = false;
private Queue<T> internalQueue;
private Thread processingThread;
public QueuedDataProcessor() {
internalQueue = new Queue<T>();
this.processingThread = new Thread(new ThreadStart(CallingThread));
this.processingThread.IsBackground = true;
this.processingThread.Start();
}
public void Enqueue(T data) {
if (stop == true)
throw new Exception("停止的对象不能再使用。");
lock (internalQueue) {
internalQueue.Enqueue(data);
//T test = internalQueue.Dequeue();
}
}
public int LeftCount {
get { return internalQueue.Count; }
}
public void Stop() {
if (!stop) {
stop = true;
processingThread.Join();
}
}
private void CallingThread() {
while (!stop) {
//先粗略判断,优化速度
if (internalQueue.Count == 0) {
Thread.Sleep(100);
continue;
}
lock (internalQueue) {
if (internalQueue.Count > 0) {
T data = internalQueue.Dequeue();
OnProcessDataEventHandler(data);
}
}
}
}
public delegate void ProcessDataEventHandler<U>(object sender, U data);
public event ProcessDataEventHandler<T> ProcessData;
protected void OnProcessDataEventHandler(T data) {
if (ProcessData != null)
ProcessData.Invoke(this, data);
}
}
------解决方案--------------------
多线程吗?如果有多个线程,那么你不能保证一个线程入栈,另一个线程出栈的情况发生,
------解决方案--------------------
如楼上所言,你有的时候还没放进去就取了
------解决方案--------------------
锁住push/pop