У меня есть ConcurrentStack, в который я вбрасываю элементы. Каков хороший способ обрабатывать эти элементы по одному за раз, когда стек не пуст? Я бы хотел сделать это так, чтобы не переваривать циклы процессора, когда стек не обрабатывается.Обработать ConcurrentStack, когда он не пуст?
То, что у меня есть в настоящее время, в основном такое, и это не похоже на идеальное решение.
private void AddToStack(MyObj obj)
{
stack.Push(obj);
HandleStack();
}
private void HandleStack()
{
if (handling)
return;
Task.Run(() =>
{
lock (lockObj)
{
handling = true;
if (stack.Any())
{
//handle whatever is on top of the stack
}
handling = false;
}
}
}
Таким образом, bool существует, поэтому несколько потоков не получают резервное копирование, ожидая блокировки. Но я не хочу, чтобы несколько вещей обрабатывали стек сразу, следовательно, блокировку. Поэтому, если два отдельных потока в конечном итоге вызывают HandleStack одновременно и проходят мимо bool, блокировка существует, поэтому оба они не повторяются через стек сразу. Но как только второй пройдет через замок, стек будет пустым и ничего не сделает. Так что это в конечном итоге дает мне поведение, которое я хочу.
Так что я просто пишу псевдо-параллельную оболочку вокруг ConcurrentStack, и похоже, что для этого нужно по-другому. Мысли?
Вам действительно нужен каждый элемент, который нужно обрабатывать последовательно? Если они могут обрабатываться одновременно, просто делегируйте threadpool, который будет эффективно обрабатывать свою рабочую очередь. –
Вам не нужен замок. Это ConcurrentStack, он модифицируется несколькими потоками. Если вы действительно хотите заблокировать во время ожидания, используйте BlockingCollection. По умолчанию он использует ConcurrentQueue, но вы можете указать другую параллельную коллекцию, например ConcurrentStack –
@PanagiotisKanavos. Я знаю, что она модифицирована несколькими потоками. Я хочу добавить к нему несколько потоков, но только один из них.Вот почему я запираюсь вокруг поп (обфускации позади «// обрабатывают все ...»), а не вокруг толчка. – claudekennilol