public Task PopTop() { int oldTop = top; int newTop = oldTop + 1; int oldBottom = bottom; int size = oldBottom - oldTop; if (size <= 0) { return(null); } Task t = tasks.Get(oldTop); if (Interlocked.CompareExchange(ref top, oldTop, newTop) == oldTop) { return(t); } return(null); }
public Task PopTop() { int oldTop = top; //запоминаем верхний индекс int newTop = oldTop + 1; //запоминаем новый верхний индекс int oldBottom = bottom; //запоминаем нижний индекс int size = oldBottom - oldTop; //вычисляем разницу между нижним и верхним индексом if (size <= 0) { return(null); //если нижний меньше либо равен верхнему, тогда размер <= 0, задач нет } Task t = tasks.Get(oldTop); //берем задачу по верхнему индексу if (Interlocked.CompareExchange(ref top, oldTop, newTop) == oldTop) // если удалось заменить страую верхнюю границу на новую { return(t); //урали элемент } return(null); //иначе нет }