На Azure используется сайт (Служба приложений).
Для развёртывания без прерывания сервиса используется два слота - новая версия заливается на второй слот, а потом происходит переключение между слотами.
Раз в сутки необходимо делать некие операции, для этого при запуске приложения запускается примерно следующий код
// В Global.asax
protected void Application_Start(){
// ...
var t = new Thread(new SomeClass().SomeMethod);
t.Start;
// ...
}
// В SomeClass
public void SomeMethod(){
while (true) {
// Проверяем что наступили новые сутки и делаем некую работу
Thread.Sleep(TimeSpan.FromHours(1);
}
}
Код отрабатывает как надо, всегда во-время, с ним проблем нет.
Но, возникает проблема из-за того, что два слота развёртывания, и соответственно работают два экземпляра сайта. Они срабатывают одновременно, и эта работа выполняется дважды.
Пробовал добавить в параметры боевого слота приложения параметр IsProduction и проверять его при старте задачи
if (Environment.GetEnvironmentVariable("IsProduction") == null || Environment.GetEnvironmentVariable("IsProduction") != "true") return;
Это работает, но иногда, почему то, не срабатывает, подозреваю, после переключения между слотами. Иногда после переключения между слотами второй слот считает себя боевым (IsProduction = true), и код снова срабатывает дважды.
Думал о том, чтобы добавить к сайту WebJobs, но проблема в том, что эти веб-задания переключаются вместе со слотом. Т.е. добавив задание к одному слоту после переключения это задание перейдёт ко второму слоту. А т.к. слот не используется, то его работа не гарантируется, он может выгрузиться из памяти вместе с веб-заданием.
Как правильно реализовать эти регулярные операции только один раз при использовании слотов?