ConcurrentQueue
От: VVVa  
Дата: 06.04.19 12:36
Оценка: -1
есть возможность просмотреть всю очередь
ToArray();
а вот удалить просмотренное нету
только TryDequeue

или ещё есть способ удаление из очереди?
Re: ConcurrentQueue
От: okon  
Дата: 07.04.19 01:05
Оценка:
VVV>или ещё есть способ удаление из очереди?

А зачем тогда Queue, используйте List.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re: ConcurrentQueue
От: _NN_ www.nemerleweb.com
Дата: 07.04.19 08:40
Оценка: +1
Здравствуйте, VVVa, Вы писали:

VVV>или ещё есть способ удаление из очереди?

Стоит сформулировать лучше что конкретно вам нужно.
Вам точно нужна очередь без блокировок ?

Возможно вам нужен ConcurrentDictionary ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: ConcurrentQueue
От: · Великобритания  
Дата: 08.04.19 09:28
Оценка: 3 (1) +1
Здравствуйте, VVVa, Вы писали:

VVV>есть возможность просмотреть всю очередь

VVV>ToArray();
VVV>а вот удалить просмотренное нету
VVV>только TryDequeue
VVV>или ещё есть способ удаление из очереди?
Наверное ты имеешь в виду сценарий забрать всё содержимое очереди атомарно. Если так, то можно просто создать новый экземпляр очереди и атомарно его подменить через Exchange, а старый экземпляр спокойно обработать в своём потоке и выкинуть.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: ConcurrentQueue
От: SuhanovSergey  
Дата: 08.04.19 10:15
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, VVVa, Вы писали:


VVV>>есть возможность просмотреть всю очередь

VVV>>ToArray();
VVV>>а вот удалить просмотренное нету
VVV>>только TryDequeue
VVV>>или ещё есть способ удаление из очереди?
·>Наверное ты имеешь в виду сценарий забрать всё содержимое очереди атомарно. Если так, то можно просто создать новый экземпляр очереди и атомарно его подменить через Exchange, а старый экземпляр спокойно обработать в своём потоке и выкинуть.

Тоже сначала хотел такое предложить. Но это плохая идея. Проблема в том, что читатель будет конкурировать с писателями, которые захватили ссылку на старую очередь. Даже если писатели явно не кэшируют ссылку, а читают переменную myQueue перед каждой записью myQueue.Enqueue(), всё равно будет гонка, т.к. внутри Enqueue ссылка на очередь закэширована в this.
Re[3]: ConcurrentQueue
От: · Великобритания  
Дата: 08.04.19 10:54
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:


VVV>>>есть возможность просмотреть всю очередь

VVV>>>ToArray();
VVV>>>а вот удалить просмотренное нету
VVV>>>только TryDequeue
VVV>>>или ещё есть способ удаление из очереди?
SS>·>Наверное ты имеешь в виду сценарий забрать всё содержимое очереди атомарно. Если так, то можно просто создать новый экземпляр очереди и атомарно его подменить через Exchange, а старый экземпляр спокойно обработать в своём потоке и выкинуть.
SS>Тоже сначала хотел такое предложить. Но это плохая идея. Проблема в том, что читатель будет конкурировать с писателями, которые захватили ссылку на старую очередь. Даже если писатели явно не кэшируют ссылку, а читают переменную myQueue перед каждой записью myQueue.Enqueue(), всё равно будет гонка, т.к. внутри Enqueue ссылка на очередь закэширована в this.
Ох да, верно. Проглядел! Тогда... disruptor — наше всё! Ну или dequeue поштучно, если производительность не сильно волнует.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.