powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Правильная блокировка
12 сообщений из 12, страница 1 из 1
Правильная блокировка
    #38004166
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!
Возник такой вопрос. Есть то самое многопоточное приложение , которая считает склады и потребности магазинов, считает вроде хорошо все довольны, возникла одна проблема. После расчета, когда данные выгружаются на склады в торговую систему, товароведы хотят чтоб документы между складами не путались, т.е. выгружались в строгом порядке документы по складу 1 потом по складу 2 и т.д. Причем процедура выгрузки и приема неторопливая (торговая система долго переваривает xml).
Возникает вопрос у меня для реализации многопоточности у меня испльзуется "стандартная" контрукция с
Код: c#
1.
private static readonly object WorkerLocker = new object();

,
которое потом в нужных местах лочится с помощью lock . Однако сама так как сама выгрузка дело долгое, я так понимаю, все процессы расчета будут "замирать". Чтоб не лочить этот же объект дабы не тормозить процесы обчета насколько правильно будет завести, например,
Код: c#
1.
private static readonly object WorkerLockerXml = new object();

,
который и лочит в функциях выгрузки?
Собсвенно нужно лочить цикл 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.
// выполняем общий расчет после полного окончания сбора требований
        public void UploadWorkShop(DateTime dateOrder, int intStorage)
        {
            var dtSo = new DataTable();
            // Пересчитываем пропорционально остаткам на складе
            LogToTextBox(textBoxSoLog, String.Format("{0} Расчет потребностей магазинов завершен, проверяем остатки по РЦ\r\n", DateTime.Now));
            AutoOrders.RecalcQuantityWs(dateOrder, intStorage);
            // второй круг - выгружаем из созданной таблицы в ХМЛ
            foreach (DataRowView drv in clbShopsCO.CheckedItems)
            {
                LogToTextBox(textBoxSoLog, String.Format("{0} Выгружаем заказы для склада {1} для магазина {2}", DateTime.Now, intStorage, drv["name"]));
                dtSo.Clear();
                dtSo = AutoOrders.FillDataTable(dateOrder, Convert.ToInt32(drv["id"]), intStorage).Copy();
                if (dtSo.Rows.Count > 0)
                {
                    lock (WorkerLocker)
                    {
                        LogToTextBox(textBoxSoLog, String.Format("Начало выгрузки"));
                        string strResult = AutoOrders.CreateXmlCo(dtSo, Convert.ToInt32(drv["id"]), dateOrder);
                        LogToTextBox(textBoxSoLog, String.Format("{0}", strResult));
                    }
                }
                else
                {
                    LogToTextBox(textBoxSoLog, String.Format("Заказ пустой"));
                }
            }
        }
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004266
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolf,
вопрос,
Десять потоков решают задачу.
каждый поток поток после решения сохраняет результат.
партикулярный своей задаче.
по окончанию всех потоков, результаты выдаются в заданной бабушкиной последовательности.
Теперь сам вопрос, ну что тут лочить?
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004283
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolf,
И второй вопрос, что это у вас за функция такая, что выгрузку из разных потоков в ней надо лочить.( вызывает умиление)
Кто ее писал- поставьте к стенке МСУ
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004313
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
поэтому и возникает желание отдельно лочить функцию выгрузки.
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004341
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
поэтому и возникает желание отдельно лочить функцию выгрузки.

чтобы отсортировать результаты выгрузки совершенно не нужно лочить саму выгрузку
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004347
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pation,
Выгрузка каждого склада может начаться в любое время (по окончании расчета) причем предыдущие склады могут еще выгружаться. Еще раз повотюрю что в ТС файлы идут строго по одному (чтоб не было проблем в нумерацией). Т.е. в данном случае нужно заставить досчитавшийся склад выгрузки предудущего (если она есть).
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004353
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolf,
Объясните, что это такая за функция выгрузки, что ее надо лочить, мозг взрывается - как такое можно написать.
Мне в общем то не интересно, чем занимаются потоки, ну будь их не десять ну предположим - 1400 ( было такое в реале)
сама схема не меняется..
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004355
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolfpation,
Выгрузка каждого склада может начаться в любое время (по окончании расчета) причем предыдущие склады могут еще выгружаться. Еще раз повотюрю что в ТС файлы идут строго по одному (чтоб не было проблем в нумерацией). Т.е. в данном случае нужно заставить досчитавшийся склад выгрузки предудущего (если она есть).

вот видите уже начинаете понимать
у вас 2 задачи
1. Создать файл
2. Выгрузить созданый файл с правильным именем
ещё немного подумайте и найдёте правильное решение
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004358
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolfpation,
Выгрузка каждого склада может начаться в любое время (по окончании расчета) причем предыдущие склады могут еще выгружаться. Еще раз повотюрю что в ТС файлы идут строго по одному (чтоб не было проблем в нумерацией). Т.е. в данном случае нужно заставить досчитавшийся склад выгрузки предудущего (если она есть).
так что вы хотите?, не меняя ахитектуру убежать от локов, да флаг вам - используйте очередь
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004376
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pation,

Имя файла тут не поможет, их хоть обсаздовайся с любыми именами и в любых количествах. Проблема в самой ТС, точнее в ее модуле обмена.
Еще более подробно.
1. Досчитывается склад.
2. Проверяются остатки и при необходимости корректируются документы (пока все прекрасно).
3. ЗАпрашиваем ТС, а какой следующий номер документа? получаем его. Причем теперь начинается цирк, на этом этапе мы не можем узнать номер следующего документа, пока система не загрузит предыдущий (ну вот так вот )).
4. формируем XML с данным подставляя в него номер, который ждет система, который она сама и выдала на этапе 3
5. Скармливаем файл ТС. Ждем от нее ответа о успешном приеме.
6. Если есть еще документы переходим к п.3.
Т.е. я не могу заранее сформировать кучу файлов с нужными номерами. Собсвенно из-за этого весь и цирк.

ЗЫ. Предложение о введении для подобных документов своих номеров с префиксами, чтобю они разруливались внешним приложение отвергнуто бухгалтерией, а сам ТС не может принять файл с пустым номером, чтоб автоматом выдать свой.
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004389
Crazy_Wolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степиCrazy_Wolfpation,
Выгрузка каждого склада может начаться в любое время (по окончании расчета) причем предыдущие склады могут еще выгружаться. Еще раз повотюрю что в ТС файлы идут строго по одному (чтоб не было проблем в нумерацией). Т.е. в данном случае нужно заставить досчитавшийся склад выгрузки предудущего (если она есть).
так что вы хотите?, не меняя ахитектуру убежать от локов, да флаг вам - используйте очередь
Если можно ткние носом в пример, просто это мой первый опыт работы с потоками.
...
Рейтинг: 0 / 0
Правильная блокировка
    #38004495
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crazy_Wolf,
Вы лочите всю процедуру логирования, создайте очередь, в эту очередь будут с одного конца закидываться
результаты, а с другого конца они будут выгребаться уже на запись, это гораздо быстрее
чем ждать весь результат записи, и двигать снова.
или посмотрите в сторону log4net, или NLog, вполне потоконезависимое решение
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Правильная блокировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]