在多个线程中工作的队列中的内存问题

时间:2019-07-07 08:12:27

标签: c# multithreading queue out-of-memory

我的程序可以处理队列和大文件。我在多个线程中使用队列,有时由于队列中第一个线程中排队的对象过多而导致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的建议是什么?

0 个答案:

没有答案