Как проверить, что текущий поток последний?

Kosilovka

Новичок
Регистрация
12.05.2017
Сообщения
18
Благодарностей
4
Баллы
3
В конце работы шаблона необходимо совершить некоторые действия (обнулить глобальные счетчики), но их нельзя трогать, пока работают другие процессы. Как узнать, что текущий процесс является последним ?

Сейчас я использую в конце шаблона (good end, bad end)

Код:
 ZennoPoster.AllInstances.Count();
что бы получить количество активных потоков и если кол-во === 1 (значит последний) выполняю что нужно. Но, работает такой подход не очень стабильно, иногда, возвращает более одного в тот момент когда шаблон отработал.

Подскажите, как еще можно определить конец работы шаблона (когда прогресс 100%) ? Может значения прогресса возможно получить?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 706
Баллы
113
Используйте диспетчер задач. Он соблюдает порядок выполнения
 
  • Спасибо
Реакции: dmbulaev и Kosilovka

Kosilovka

Новичок
Регистрация
12.05.2017
Сообщения
18
Благодарностей
4
Баллы
3
Используйте диспетчер задач. Он соблюдает порядок выполнения
Имеете в виду создать второй шаблон, который будет обнулять переменные? А если их имена генерируются динамически и заранее не оно не известно ?
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 367
Благодарностей
3 292
Баллы
113
Имеете в виду создать второй шаблон, который будет обнулять переменные? А если их имена генерируются динамически и заранее не оно не известно ?
Добавить в логику шаблона сохранение имён переменных, например, в файл или в другую глобальную переменную.
 
  • Спасибо
Реакции: Kosilovka

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
например во входных настройках ставить начальное количество выполнений, которое потом поставите настройках задания и потом уменьшать это количество до 1 с записью в файл, как вариант.
другой вариант - получать string taskInfo = ZennoPoster.GetTaskInfo(taskId) и в нём скорее всего содержится количество оставшихся выполнений
 
  • Спасибо
Реакции: Kosilovka

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
В конце работы шаблона необходимо совершить некоторые действия (обнулить глобальные счетчики), но их нельзя трогать, пока работают другие процессы. Как узнать, что текущий процесс является последним ?

Сейчас я использую в конце шаблона (good end, bad end)

Код:
 ZennoPoster.AllInstances.Count();
что бы получить количество активных потоков и если кол-во === 1 (значит последний) выполняю что нужно. Но, работает такой подход не очень стабильно, иногда, возвращает более одного в тот момент когда шаблон отработал.

Подскажите, как еще можно определить конец работы шаблона (когда прогресс 100%) ? Может значения прогресса возможно получить?
Добавьте еще одну глобальную переменную, со значением 0, каждый поток при старте ее увеличивает, при бэд енд или гуд энд уменьшает, и как только она опять станет равна 0, значит надо чистить.
Или можно использовать список привязанный к файлу, при старте добавляем туда строку, при завершении удаляем, как только строки кончились шаблонов не осталось.
 

freeman

Client
Регистрация
31.07.2010
Сообщения
130
Благодарностей
138
Баллы
43
например во входных настройках ставить начальное количество выполнений, которое потом поставите настройках задания и потом уменьшать это количество до 1 с записью в файл, как вариант.
другой вариант - получать string taskInfo = ZennoPoster.GetTaskInfo(taskId) и в нём скорее всего содержится количество оставшихся выполнений
А вот и код подъехал.
Код:
lock (CommonCode.SyncObject)
{
    Guid taskId = Guid.Parse(project.TaskId);
    string taskInfo = ZennoPoster.GetTaskInfo(taskId);
              
    System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
    doc.LoadXml("<Task>" + taskInfo + "</Task>");
              
    System.Xml.XmlNode maxTries = doc.SelectSingleNode("Task/ExecutionSettings/NumberOfTries");
              
    if (maxTries != null)
    {
        if (int.Parse(maxTries.InnerText) == 1)
        {
            // Тут делаем все что нужно при условии,
            // что осталась 1 потытка выполнения шаблона
        }              
    }
}
 

freeman

Client
Регистрация
31.07.2010
Сообщения
130
Благодарностей
138
Баллы
43
Добавьте еще одну глобальную переменную, со значением 0, каждый поток при старте ее увеличивает, при бэд енд или гуд энд уменьшает, и как только она опять станет равна 0, значит надо чистить.
Или можно использовать список привязанный к файлу, при старте добавляем туда строку, при завершении удаляем, как только строки кончились шаблонов не осталось.
Во-первых, проверять надо на 1, так как условный последний поток еще сам работает и не завершился успешно/безуспешно, снизив значение счетчика.
Во-вторых, это в любом случае не сработает ни со счетчиком, ни с файлом. А причина проста, часто при перезагрузке инстансов количество выполняемых потоков падает до нуля, а впереди еще много попыток выполнения. В такие моменты счетчик будет на нуле, а файл пуст.
 
  • Спасибо
Реакции: Kosilovka

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
Во-вторых, это в любом случае не сработает ни со счетчиком, ни с файлом.
с файлом прокатит в варианте, когда - во входных настройка ставим в переменную - запланировали выполнить=10 раз, ставим в настройках задания 10 раз, начинаем шаблон - проверяем файл с записью числа выполнений, если файла нет - создаём и записываем 10, потом шаг взятия числа и проверки на равенство 1, если нет, то перезаписываем сразу же число в файле на единицу меньше или выходим по логике для числа 1. Но ваш вариант более изящнее
 
  • Спасибо
Реакции: Kosilovka

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
Во-первых, проверять надо на 1, так как условный последний поток еще сам работает и не завершился успешно/безуспешно, снизив значение счетчика.
Сначала уменьшаем значение, а потом только проверяем, если сначала проверять а потом уменьшать, то вы будете натыкаться на коллизии, когда 2 потока проверили, потом оба уменьшили, и в итоге ни один ничего не сделал.

Во-вторых, это в любом случае не сработает ни со счетчиком, ни с файлом. А причина проста, часто при перезагрузке инстансов количество выполняемых потоков падает до нуля, а впереди еще много попыток выполнения. В такие моменты счетчик будет на нуле, а файл пуст.
Ни разу такого не было, хотя с глобальные переменные не использую и может если запускать совсем короткие шаблоны такое и будет х.з., но я наверно даже если захочу так спецом сделать, то врятли получится.

Ну и если говорить о подчищении при любом способе остановки шаблона, даже при прерывании, то тогда надо worker запускать, и им проверять какой там статус у нашего проекта, т.к. при прерывании проекта в бэденд вы не попадете, и чтобы подчистить переменные глобальные надо будет запускать отдельный проект который это сделает, а воркер держит поток.
 
Последнее редактирование:
  • Спасибо
Реакции: Kosilovka

Kosilovka

Новичок
Регистрация
12.05.2017
Сообщения
18
Благодарностей
4
Баллы
3
Добавьте еще одну глобальную переменную, со значением 0, каждый поток при старте ее увеличивает, при бэд енд или гуд энд уменьшает, и как только она опять станет равна 0, значит надо чистить.
Или можно использовать список привязанный к файлу, при старте добавляем туда строку, при завершении удаляем, как только строки кончились шаблонов не осталось.
На данный момент именно так и сделал. вроде бы работает без сбоев

А вот и код подъехал.
Это интересно. спасибо, проверю.

Ну и если говорить о подчищении при любом способе остановки шаблона, даже при прерывании, то тогда надо worker запускать, и им проверять какой там статус у нашего проекта, т.к. при прерывании проекта в бэденд вы не попадете, и чтобы подчистить переменные глобальные надо будет запускать отдельный проект который это сделает, а воркер держит поток.
а можно подробнее об этом воркере ?
 

Kosilovka

Новичок
Регистрация
12.05.2017
Сообщения
18
Благодарностей
4
Баллы
3
А вот и код подъехал.
Компиляция кода Ошибка в действии "CS0103" "Имя "CommonCode" отсутствует в текущем контексте".

если немного изменить:
Компиляция кода Ошибка в действии "CS0234" "Имя типа или пространства имен "XmlDocument" отсутствует в пространстве имен "System.Xml" (пропущена ссылка на сборку?)".
Компиляция кода Ошибка в действии "CS0234" "Имя типа или пространства имен "XmlNode" отсутствует в пространстве имен "System.Xml" (пропущена ссылка на сборку?)".

подскажите, что там дополнительно подключить нужно ?
 

freeman

Client
Регистрация
31.07.2010
Сообщения
130
Благодарностей
138
Баллы
43
Нужно добавить на панели инструмент Ссылки из GAC и подключить System.Xml.dll
 
  • Спасибо
Реакции: iBotovod и Kosilovka

Kosilovka

Новичок
Регистрация
12.05.2017
Сообщения
18
Благодарностей
4
Баллы
3
Нужно добавить на панели инструмент Ссылки из GAC и подключить System.Xml.dll
С начала не ту ссылку добавил (нашлось несколько) - подумал что не то. сменил - все супер. спасибо
 

dmbulaev

Новичок
Регистрация
03.10.2017
Сообщения
1
Благодарностей
0
Баллы
1

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)