Отложенный запуск потоков??

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
86
Благодарностей
7
Баллы
8
Всем привет
пробую сделать отложенный запуск потоков

У меня почти верно получилось, но! 1й поток стартует в любом случае, в второй ждем запуска положенное количество времени
как мне сделать, чтобы оба потока ждали запуска столько сколько им необходимо?
задания берутся из разных строк таблицы

1й поток например старт должен быть через 3 минуты от текущего времени
2й поток - через 7 минут
и тд

данный код у меня находится в отдельном кубике
логика работы шаблона во втором кубике

код сделал по мотивам тем на форуме:
C#:
int timeOut; //время задержки

DateTime jobDate;
DateTime jobTimeStart;
DateTime ProfTimeExit;

project.SendInfoToLog("1",true);

lock(SyncObject) {
    project.SendInfoToLog("1_1",true);
    var gbVar = project.GlobalVariables["MyNameSpace", "Counter"];
    project.SendInfoToLog("1_2",true);
    gbVar.Value = Convert.ToInt32(gbVar.Value.ToString())+1;
    project.SendInfoToLog("1_3",true);
    project.Variables["rowNumber"].Value = gbVar.Value.ToString();
}

project.SendInfoToLog("2",true);

//var id = Guid.Parse(project.TaskId);
//ZennoPoster.AddTries(id, 1);

lock(SyncObjects.TableSyncer){

    IZennoTable ProfTasks = project.GoogleSpreadsheets["ProfTasks"];
    string ProfTask = project.Variables["ProfTask"].Value;
    
    ProfTask = ProfTasks.GetCell("H",Convert.ToInt32(project.Variables["rowNumber"].Value));
    project.SendInfoToLog("Тип задания - " + ProfTask,true);
    jobDate = DateTime.ParseExact(ProfTasks.GetCell("I",Convert.ToInt32(project.Variables["rowNumber"].Value)), "dd.MM.yyyy", CultureInfo.CreateSpecificCulture("ru-RU"));
    project.SendInfoToLog("Дата работы с заданием - " + jobDate.ToString("dd.MM.yyyy"),true);
    jobTimeStart = DateTime.ParseExact(ProfTasks.GetCell("J",Convert.ToInt32(project.Variables["rowNumber"].Value)), "H:mm:ss",CultureInfo.CreateSpecificCulture("ru-RU"));
    project.SendInfoToLog("Время старта работы с заданием - " + jobTimeStart.ToString("H:mm:ss"),true);
    ProfTimeExit = DateTime.ParseExact(ProfTasks.GetCell("K",Convert.ToInt32(project.Variables["rowNumber"].Value)), "H:mm:ss",CultureInfo.CreateSpecificCulture("ru-RU"));
    project.SendInfoToLog("Время окончания работы с заданием - " + ProfTimeExit.ToString("H:mm:ss"),true);
    project.SendInfoToLog("rowNumber - " + project.Variables["rowNumber"].Value,true);
}

DateTime timeNow = DateTime.Now; //начальная дата

TimeSpan timeDiff = jobTimeStart.Subtract(DateTime.Now);

timeOut = (int)Math.Floor(timeDiff.TotalMilliseconds); //задержка

project.SendInfoToLog("timeOut - " + timeDiff.TotalSeconds + " сек.",true);

lock(SyncObjects.InputSyncer){
    try{
        var tickCount = project.GlobalVariables["MyNameSpace", "TickCount"];
        if(tickCount.Value.ToString() == string.Empty){
            project.GlobalVariables.SetVariable("MyNameSpace", "TickCount", Environment.TickCount);
            return "ok ---";
        }
        if(tickCount.Value + timeOut * 1000 > Environment.TickCount){
            project.SendInfoToLog("Поток с Id -" + Thread.CurrentThread.ManagedThreadId.ToString() + " будет ожидать запуска: " + timeOut + " мсек.",true);
            System.Threading.Thread.Sleep(timeOut);
            project.GlobalVariables.SetVariable("MyNameSpace", "TickCount", Environment.TickCount);
        }else{
            project.SendInfoToLog("Запускаем работу потока Id - " + Thread.CurrentThread.ManagedThreadId.ToString() + " т.к. время старта задания меньше текущего.",true);
        }
    }catch(KeyNotFoundException ex){
        project.GlobalVariables.SetVariable("MyNameSpace", "TickCount", Environment.TickCount);
    }
}
 

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
86
Благодарностей
7
Баллы
8
Способ, конечно тот еще, но так работает:
C#:
while(DateTime.Now<jobTimeStart){
        project.SendInfoToLog("Текущее время: " + DateTime.Now + ". Ждем старта потока: " + Thread.CurrentThread.ManagedThreadId.ToString(),true);
    }
конструкция в lock
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
Способ, конечно тот еще, но так работает:
C#:
while(DateTime.Now<jobTimeStart){
        project.SendInfoToLog("Текущее время: " + DateTime.Now + ". Ждем старта потока: " + Thread.CurrentThread.ManagedThreadId.ToString(),true);
    }
конструкция в lock
что это за жесть ? бедный лог.... :bm:
 

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
86
Благодарностей
7
Баллы
8
что это за жесть ? бедный лог.... :bm:
ага.. жесть та еще. Как правильно сделать?
кстати, это тоже не помогло. 1й поток все равно идет на выполнение, пауза идет только у второго
 

Angi.gaponova

Новичок
Регистрация
25.10.2021
Сообщения
2
Благодарностей
0
Баллы
1
Добрый день! Я, возможно, пишу не там, но увидела, что у Вас (Nelirr) есть наработки по ботам для маркетплейсов (Вайлдбериз). Как можно с Вами связаться?
 

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
86
Благодарностей
7
Баллы
8

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