Моя программа работает с очередью и большим файлом. Я работаю с очередью в нескольких потоках, и в какой-то момент возникает OutOfMemoryException из-за слишком большого количества объектов, помещенных в очередь в первом потоке в очереди. Им не удается удалить из очереди второй поток так быстро, как требуется.
P.S. Я могу использовать только примитивы синхронизации (Thread, Monitor)
Я уже написал код, который работает с не очень большими данными. Я знаю, что могу сделать 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?