|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Приветствую! Возник такой вопрос. Есть то самое многопоточное приложение , которая считает склады и потребности магазинов, считает вроде хорошо все довольны, возникла одна проблема. После расчета, когда данные выгружаются на склады в торговую систему, товароведы хотят чтоб документы между складами не путались, т.е. выгружались в строгом порядке документы по складу 1 потом по складу 2 и т.д. Причем процедура выгрузки и приема неторопливая (торговая система долго переваривает xml). Возникает вопрос у меня для реализации многопоточности у меня испльзуется "стандартная" контрукция с Код: c# 1.
, которое потом в нужных местах лочится с помощью lock . Однако сама так как сама выгрузка дело долгое, я так понимаю, все процессы расчета будут "замирать". Чтоб не лочить этот же объект дабы не тормозить процесы обчета насколько правильно будет завести, например, Код: c# 1.
, который и лочит в функциях выгрузки? Собсвенно нужно лочить цикл foreach (DataRowView drv in clbShopsCO.CheckedItems) В данный момент лочится только CreateXmlCo, но при этом два одновременно рассчитавшихся склада выгружаются вразброс, а не последовательно. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 13:45 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Crazy_Wolf, вопрос, Десять потоков решают задачу. каждый поток поток после решения сохраняет результат. партикулярный своей задаче. по окончанию всех потоков, результаты выдаются в заданной бабушкиной последовательности. Теперь сам вопрос, ну что тут лочить? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 14:33 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Crazy_Wolf, И второй вопрос, что это у вас за функция такая, что выгрузку из разных потоков в ней надо лочить.( вызывает умиление) Кто ее писал- поставьте к стенке МСУ ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 14:44 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Где-то в степи, Там смысл в том что потоков далеко не 10, ссылка на описание в вопросе. Вкратце есть 10 складов и 41 торговая точка, на все это расчитывается потребность, причем отслеживается момент окончания расчета по каждому складу, и запускается суммарная проверка остатков на центральном складе и перераспределения всего добра нажитого по магазинам. После чего для склада запускается для него процедура пересчета остатков, а затем и выгрузки, а остальные пускай считаются себе дальше. Второй затык, чтобы торговая система нормально принимала файлы, требуется генерация их по одному. В текущем варианте все работает прекрасно, есть одно но которое не нравиться нашим товароведам, если расчитался и начал выгружаться допустим склад 1 и одновременно с ним досчитался склад 5 то выгрузка быдет примерно такая Склад1Документ1 Склад1Документ2 Склад5Документ1 Склад1Документ3 ...... и т.д. а надо чтоб Склад1Документ1 Склад1Документ2 Склад1Документ3 Склад5Документ1 Склад5Документ2 поэтому и возникает желание отдельно лочить функцию выгрузки. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 14:57 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Crazy_WolfГде-то в степи, Там смысл в том что потоков далеко не 10, ссылка на описание в вопросе. Вкратце есть 10 складов и 41 торговая точка, на все это расчитывается потребность, причем отслеживается момент окончания расчета по каждому складу, и запускается суммарная проверка остатков на центральном складе и перераспределения всего добра нажитого по магазинам. После чего для склада запускается для него процедура пересчета остатков, а затем и выгрузки, а остальные пускай считаются себе дальше. Второй затык, чтобы торговая система нормально принимала файлы, требуется генерация их по одному. В текущем варианте все работает прекрасно, есть одно но которое не нравиться нашим товароведам, если расчитался и начал выгружаться допустим склад 1 и одновременно с ним досчитался склад 5 то выгрузка быдет примерно такая Склад1Документ1 Склад1Документ2 Склад5Документ1 Склад1Документ3 ...... и т.д. а надо чтоб Склад1Документ1 Склад1Документ2 Склад1Документ3 Склад5Документ1 Склад5Документ2 поэтому и возникает желание отдельно лочить функцию выгрузки. чтобы отсортировать результаты выгрузки совершенно не нужно лочить саму выгрузку ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 15:07 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
pation, Выгрузка каждого склада может начаться в любое время (по окончании расчета) причем предыдущие склады могут еще выгружаться. Еще раз повотюрю что в ТС файлы идут строго по одному (чтоб не было проблем в нумерацией). Т.е. в данном случае нужно заставить досчитавшийся склад выгрузки предудущего (если она есть). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 15:09 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Crazy_Wolf, Объясните, что это такая за функция выгрузки, что ее надо лочить, мозг взрывается - как такое можно написать. Мне в общем то не интересно, чем занимаются потоки, ну будь их не десять ну предположим - 1400 ( было такое в реале) сама схема не меняется.. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 15:12 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Crazy_Wolfpation, Выгрузка каждого склада может начаться в любое время (по окончании расчета) причем предыдущие склады могут еще выгружаться. Еще раз повотюрю что в ТС файлы идут строго по одному (чтоб не было проблем в нумерацией). Т.е. в данном случае нужно заставить досчитавшийся склад выгрузки предудущего (если она есть). вот видите уже начинаете понимать у вас 2 задачи 1. Создать файл 2. Выгрузить созданый файл с правильным именем ещё немного подумайте и найдёте правильное решение ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 15:13 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Crazy_Wolfpation, Выгрузка каждого склада может начаться в любое время (по окончании расчета) причем предыдущие склады могут еще выгружаться. Еще раз повотюрю что в ТС файлы идут строго по одному (чтоб не было проблем в нумерацией). Т.е. в данном случае нужно заставить досчитавшийся склад выгрузки предудущего (если она есть). так что вы хотите?, не меняя ахитектуру убежать от локов, да флаг вам - используйте очередь ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 15:14 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
pation, Имя файла тут не поможет, их хоть обсаздовайся с любыми именами и в любых количествах. Проблема в самой ТС, точнее в ее модуле обмена. Еще более подробно. 1. Досчитывается склад. 2. Проверяются остатки и при необходимости корректируются документы (пока все прекрасно). 3. ЗАпрашиваем ТС, а какой следующий номер документа? получаем его. Причем теперь начинается цирк, на этом этапе мы не можем узнать номер следующего документа, пока система не загрузит предыдущий (ну вот так вот )). 4. формируем XML с данным подставляя в него номер, который ждет система, который она сама и выдала на этапе 3 5. Скармливаем файл ТС. Ждем от нее ответа о успешном приеме. 6. Если есть еще документы переходим к п.3. Т.е. я не могу заранее сформировать кучу файлов с нужными номерами. Собсвенно из-за этого весь и цирк. ЗЫ. Предложение о введении для подобных документов своих номеров с префиксами, чтобю они разруливались внешним приложение отвергнуто бухгалтерией, а сам ТС не может принять файл с пустым номером, чтоб автоматом выдать свой. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 15:21 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Где-то в степиCrazy_Wolfpation, Выгрузка каждого склада может начаться в любое время (по окончании расчета) причем предыдущие склады могут еще выгружаться. Еще раз повотюрю что в ТС файлы идут строго по одному (чтоб не было проблем в нумерацией). Т.е. в данном случае нужно заставить досчитавшийся склад выгрузки предудущего (если она есть). так что вы хотите?, не меняя ахитектуру убежать от локов, да флаг вам - используйте очередь Если можно ткние носом в пример, просто это мой первый опыт работы с потоками. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 15:25 |
|
Правильная блокировка
|
|||
---|---|---|---|
#18+
Crazy_Wolf, Вы лочите всю процедуру логирования, создайте очередь, в эту очередь будут с одного конца закидываться результаты, а с другого конца они будут выгребаться уже на запись, это гораздо быстрее чем ждать весь результат записи, и двигать снова. или посмотрите в сторону log4net, или NLog, вполне потоконезависимое решение ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2012, 16:02 |
|
|
start [/forum/topic.php?fid=20&fpage=191&tid=1405783]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
others: | 331ms |
total: | 483ms |
0 / 0 |