我的程序可以处理队列和大文件。我在多个线程中使用队列,有时由于队列中第一个线程中排队的对象过多而导致OutOfMemoryException。他们无法按要求的速度在第二个线程中出队。
P.S。我可以只使用同步原语(线程,监视器)
我已经写了一个代码,该代码适用于不是很大的数据。我知道当队列中存在一定数量的对象时,我可以执行Thread.Sleep(这是可行的,我很高兴)。据我了解,这不是最佳解决方案
class SynchronizedQueue
{
protected readonly object locker = new object();
protected Queue<BlockData> queue = new Queue<BlockData>();
public int Counter { get; set; }
public bool IsClose { get; set; }
public bool TryDequeue(out BlockData blockData)
{
lock (locker)
{
while (queue.Count == 0)
{
if (IsClose)
{
blockData = new BlockData();
return false;
}
Monitor.Wait(locker);
}
blockData = queue.Dequeue();
return true;
}
}
public void Close()
{
lock (locker)
{
IsClose = true;
Monitor.PulseAll(locker);
}
}
public void Enqueue(BlockData blockData)
{
lock (locker)
{
//That's what i want to avoid
if (Counter == 1000)
{
Thread.Sleep(240);
}
if (IsClose)
throw new InvalidOperationException("Work was canceled!");
while (blockData.Id != Counter)
Monitor.Wait(locker);
queue.Enqueue(blockData);
Counter++;
Monitor.PulseAll(locker);
}
}
}
关于同步入队/出队并避免OutOfMemoryException的建议是什么?