|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Есть List<T>. Или Queue<T>. Не важно. Есть метод AddData (IEnumerable<T> newData) { foreach(var data in newData) myQueue.Enqueue(data); } Как гарантировать, что при очередном вызове AddData прошлый вызов этого метода успеет записать все данные в myQueue и новые данные не станут чередоваться с прошлыми? Т. е. хочу, чтобы все блоки newData были записаны в myQueue последовательно, без перемешки. Штука ещё в том, что метод AddData может работать в WCF-сервисе (а может и в обычном настольном приложении форм или WPF - т. е. два случая). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2015, 19:14 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Забыл выделить код. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2015, 19:14 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Alexey2112новые данные не станут чередоваться с прошлыми? с прошлыми или добавленными другим потоком? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2015, 19:24 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
ИзопропилAlexey2112новые данные не станут чередоваться с прошлыми? с прошлыми или добавленными другим потоком? Я тут сам не уверен. У меня есть два варианта. Первый - это когда другим потоком добавляешь. Второй, это когда ты вызываешь одним потоком на клиенте метод службы много раз. Его второй раз нельзя вызвать, пока первый раз не отработает, если в одном потоке? Извиняюсь, если тупые вопросы задаю - ничего в голове не осталось. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2015, 19:40 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2015, 20:46 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Просьба модераторам - не переносите тему в WCF-раздел, т. к. тема на пограничье находится, так что пусть здесь продолжается. Поясните, пожалуйста, кто-нибудь. Я сейчас создал WCF-службу и в ней метод, добавляющий коллекцию данных в Queue и в ConcurrentQueue с паузами между добавлениями через Thread.Sleep(500). Подробности см. в приведённом ниже коде. Затем вызвал этот метод несколько раз с передачей в него коллекций значений. На выходе из службы получил для разных сочетаний вызова методов (неасинхронный и асинхронный, причём последний - с помощью встроенной в 2012 студию утилиты, которая по умолчанию создаёт Task-based асинхронные варианты методов) и типа коллекции следующее: асинхронный вызов, ConcurrentQueue<T> 3 33 333 3333 1 11 111 1111 4 44 444 4444 2 22 222 2222 асинхронный вызов, Queue<T> 4 44 444 4444 1 11 111 1111 2 22 222 2222 3 33 333 3333 синхронный вызов, ConcurrentQueue<T> 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 синхронный вызов, Queue<T> 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 Т. е. парядок добавляемых элементов сохраняется всегда - вне зависимости от синхронности вызовов или многопоточных-однопоточных коллекций. А вот порядок добавляемых последовательностей - зависит от синхронности вызова добавляющего метода. А вот код служба (все настройки по умолчанию - только поведение на Single поменял, чтобы служба помнила состояние без использования байндинга, поддерживающего сессии) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
клиент Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
Вопросы. 1. Почему порядок внутри последовательностей всегда сохраняется, даже если я использую обычную Queue? 2. Почему порядок самих последовательностей нарушается, когда я использую асинхронный вызов добавляющего метода, даже если при этом используется ConcurrentQueue? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 11:06 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Какую вообще потокобезопасность гарантирует ConcurrentQueue<T>? Что позразумевается под потокобезопасностью в ConcurrentQueue<T>? Мне надо, чтобы когда я вызываю синхронно метод службы, добавляющий входящую последовательность элементов в результирующую коллекцию, элементы в результирующей коллекции сохраняли порядок не только как во входящих последовательностях, но и порядок самих входящих последовательностей (т. е. порядок добавления последовательностей). Этого я смог добиться на обычной Queue<T> при синхронном вызове метода службы. Зачем тут может понадобиться ConcurrentQueue<T>? С другой стороны, при асинхронном добавлении последовательностей не спасает и ConcurrentQueue<T>. Так зачем она нужна тогда? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 11:13 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Alexey2112 1. Почему порядок внутри последовательностей всегда сохраняется, даже если я использую обычную Queue? а как может в ОЧЕРЕДИ измениться? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 11:24 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Alexey2112 2. Почему порядок самих последовательностей нарушается, когда я использую асинхронный вызов добавляющего метода, даже если при этом используется ConcurrentQueue? ConcurrentQueue понятия не имеет ни о каких "входящих последовательностях" ConcurrentQueue обеспечивает потокобезопасность добавления/извлечения отдельно взятого элемента очереди ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 11:27 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
ИзопропилConcurrentQueue обеспечивает потокобезопасность добавления/извлечения отдельно взятого элемента очереди Что это значит? Я читал МСДН про ConcurrentQueue - там написано thread-safe. Читаю оправдания Липперта про какой-то косяк в дотнете - он там начинает демагогию разводить про то, что можно по-разному понимать потокобезопасность и вообще "чего вы от меня хотите - я не многопоточный программист практически вообще". ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 11:48 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
ИзопропилAlexey2112 1. Почему порядок внутри последовательностей всегда сохраняется, даже если я использую обычную Queue? а как может в ОЧЕРЕДИ измениться? Разные потоки добавляют в очередь данные асинхронно. Почему все одноциферные числа сохраняют порядок? Должны же перемешаться - я специально усыплял поток на полсекунды, чтобы другие успели добавить. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 11:48 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Очередь - это FIFO - первым вошёл - первым вышел с чего порядок нарушаться должен? потокобезопасность - для предотвращения разрушения внутренней структуры при одновременном добавлении/извлечении ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 11:53 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
ИзопропилОчередь - это FIFO - первым вошёл - первым вышел с чего порядок нарушаться должен? потокобезопасность - для предотвращения разрушения внутренней структуры при одновременном добавлении/извлечении Когда я делаю client.AddDataAsync(v1); client.AddDataAsync(v2); client.AddDataAsync(v3); client.AddDataAsync(v4); с чего в Queue сохраняется порядок добавленных v1-v4? Если бы это был метод в самой Queue, я бы ещё мог понять, что внутри самой очереди есть типа буфер, который запоминает последовательность вызова методов EnqueueRange или что-то такое. Но у Queue нет метода EnqueueRange, а внутри AddDataAsync я вызваю обычный Enqueue с паузой в полсекунды. Т. е. во время этой паузы ничто не мешает другим потокам вставить в очередь свои значения. Так почему же не вставляют? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 11:58 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Я, кажется, понял. Тут ещё штука в том, что время на добавление всех 16 элементов с паузами по полсекунды всегда одинаково - 8 секунд. Независимо от того, синхронно или асинхронно я вызываю добавляющие методы. Т. е. методы AddDataAsync со своими Task всё равно ждут друг дружку, если сделать несколько их вызовов. Т. е. 1. Пока с очередью работает один AddDataAsync, другие ждут. 2. А вот порядок, в котором эти AddDataAsync работают с очередью, может не совпадать с порядком, в котором они были вызваны. Пункт 2 мне понятен. Пункт 1 - нет. Причём 1 выполняется и с Queue, и с ConcurrentQueue. Почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 12:05 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Alexey2112client.AddDataAsync что за шняга? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 12:06 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
авторвремя на добавление всех 16 элементов с паузами по полсекунды всегда одинаково - 8 секунд. Независимо от того, синхронно или асинхронно я вызываю добавляющие методы И независимо от того, использую я Queue или ConcurrentQueue. Т. е. во всех четырёх случаях моего теста время добавления элементов было одинаковым. Почему? Ведь в случае с ConcurrentQueue должно было быть не сильно больше 2 секунд - все вызовы AddDataAsync должны были начать работу почти одновременно, а не ждать друг друга? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 12:07 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
ИзопропилAlexey2112client.AddDataAsync что за шняга? Клиенсткий прокси-класс для службы. У меня всё стандартно из шаблонов студии. Создал два проекта - консольное приложение и службу. В службу вставил свой код выше. На клиенте - добавил ссылку на работающую службу (запустил её в студии по ф5) и мне сгенерился такой прокси-класс. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 12:08 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Alexey2112Клиенсткий прокси-класс для службы.\ малая нагрука и свезло Alexey2112все вызовы AddDataAsync должны были начать работу почти одновременно, а не ждать друг друга? пакеты через сетевой интерфейс последовательно передаются- никакой мистики (агрегирование здесь рассматривать не будем) Что делать? - последовательность добавлять через одно обращение к сервису, собственно в сервисе - при добавлении блокировать всю коллекцию другими словами - цикл добавления элементов должен быть в сервисе, а не клиенте ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2015, 23:32 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Изопропилмалая нагрука и свезло Чего? Изопропилпакеты через сетевой интерфейс последовательно передаются- никакой мистики (агрегирование здесь рассматривать не будем) Да, но я на сервисе специально задержку поставил в полсекунды. Четыре добавления - 2 секунды задержка. Службу и клиент на одной машине запущены - задержек в передаче пакетов быть не должно. Почему по факту каждый асинхронный вызов метода службы ждал, пока другие методы отработают? Получается, асинхронный вызов метода службы асинхронен только для клиента - для службы он по-прежнему синхронен? Изопропил(агрегирование здесь рассматривать не будем) Что за аггрегирование? ИзопропилЧто делать? - последовательность добавлять через одно обращение к сервису, собственно в сервисе - при добавлении блокировать всю коллекцию другими словами - цикл добавления элементов должен быть в сервисе, а не клиенте Так и так в сервисе цикл? Или вы и про добавление самих последовательностей? У меня добавление элементов последовательности в очередь - в сервисе. А добавление последовательностей - на клиенте. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2015, 03:57 |
|
Как гарантировать последовательное заполнение коллекции приходящими последовательностями?
|
|||
---|---|---|---|
#18+
Alexey2112У меня добавление элементов последовательности в очередь - в сервисе. А добавление последовательностей - на клиенте. целиком "последовательность" передавайте(одним обращением к сервису) и будет счастье Alexey2112Что за аггрегирование? агрегирование сетевых интерфейсов - это железо Alexey2112Получается, асинхронный вызов метода службы асинхронен только для клиента - для службы он по-прежнему синхронен? сервису абсолютно фиолетово что там у клиента с ожиданием завершения операции ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2015, 08:57 |
|
|
start [/forum/topic.php?fid=20&msg=39011834&tid=1401351]: |
0ms |
get settings: |
13ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
41ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 163ms |
0 / 0 |