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

Kosilovka

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

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

Код:
Развернуть Свернуть Копировать
 ZennoPoster.AllInstances.Count();

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

Подскажите, как еще можно определить конец работы шаблона (когда прогресс 100%) ? Может значения прогресса возможно получить?
 
Используйте диспетчер задач. Он соблюдает порядок выполнения
 
  • Спасибо
Реакции: dmbulaev и Kosilovka
Используйте диспетчер задач. Он соблюдает порядок выполнения
Имеете в виду создать второй шаблон, который будет обнулять переменные? А если их имена генерируются динамически и заранее не оно не известно ?
 
Имеете в виду создать второй шаблон, который будет обнулять переменные? А если их имена генерируются динамически и заранее не оно не известно ?
Добавить в логику шаблона сохранение имён переменных, например, в файл или в другую глобальную переменную.
 
  • Спасибо
Реакции: Kosilovka
например во входных настройках ставить начальное количество выполнений, которое потом поставите настройках задания и потом уменьшать это количество до 1 с записью в файл, как вариант.
другой вариант - получать string taskInfo = ZennoPoster.GetTaskInfo(taskId) и в нём скорее всего содержится количество оставшихся выполнений
 
  • Спасибо
Реакции: Kosilovka
В конце работы шаблона необходимо совершить некоторые действия (обнулить глобальные счетчики), но их нельзя трогать, пока работают другие процессы. Как узнать, что текущий процесс является последним ?

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

Код:
Развернуть Свернуть Копировать
 ZennoPoster.AllInstances.Count();

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

Подскажите, как еще можно определить конец работы шаблона (когда прогресс 100%) ? Может значения прогресса возможно получить?
Добавьте еще одну глобальную переменную, со значением 0, каждый поток при старте ее увеличивает, при бэд енд или гуд энд уменьшает, и как только она опять станет равна 0, значит надо чистить.
Или можно использовать список привязанный к файлу, при старте добавляем туда строку, при завершении удаляем, как только строки кончились шаблонов не осталось.
 
например во входных настройках ставить начальное количество выполнений, которое потом поставите настройках задания и потом уменьшать это количество до 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 потытка выполнения шаблона
        }              
    }
}
 
Добавьте еще одну глобальную переменную, со значением 0, каждый поток при старте ее увеличивает, при бэд енд или гуд энд уменьшает, и как только она опять станет равна 0, значит надо чистить.
Или можно использовать список привязанный к файлу, при старте добавляем туда строку, при завершении удаляем, как только строки кончились шаблонов не осталось.
Во-первых, проверять надо на 1, так как условный последний поток еще сам работает и не завершился успешно/безуспешно, снизив значение счетчика.
Во-вторых, это в любом случае не сработает ни со счетчиком, ни с файлом. А причина проста, часто при перезагрузке инстансов количество выполняемых потоков падает до нуля, а впереди еще много попыток выполнения. В такие моменты счетчик будет на нуле, а файл пуст.
 
  • Спасибо
Реакции: Kosilovka
Во-вторых, это в любом случае не сработает ни со счетчиком, ни с файлом.
с файлом прокатит в варианте, когда - во входных настройка ставим в переменную - запланировали выполнить=10 раз, ставим в настройках задания 10 раз, начинаем шаблон - проверяем файл с записью числа выполнений, если файла нет - создаём и записываем 10, потом шаг взятия числа и проверки на равенство 1, если нет, то перезаписываем сразу же число в файле на единицу меньше или выходим по логике для числа 1. Но ваш вариант более изящнее
 
  • Спасибо
Реакции: Kosilovka
Во-первых, проверять надо на 1, так как условный последний поток еще сам работает и не завершился успешно/безуспешно, снизив значение счетчика.
Сначала уменьшаем значение, а потом только проверяем, если сначала проверять а потом уменьшать, то вы будете натыкаться на коллизии, когда 2 потока проверили, потом оба уменьшили, и в итоге ни один ничего не сделал.

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

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

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

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

Компиляция кода Ошибка в действии "CS0103" "Имя "CommonCode" отсутствует в текущем контексте".

если немного изменить:

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

подскажите, что там дополнительно подключить нужно ?
 
Нужно добавить на панели инструмент Ссылки из GAC и подключить System.Xml.dll
 
  • Спасибо
Реакции: iBotovod и Kosilovka
Нужно добавить на панели инструмент Ссылки из GAC и подключить System.Xml.dll
С начала не ту ссылку добавил (нашлось несколько) - подумал что не то. сменил - все супер. спасибо
 

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