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

Nelirr

Пользователь
Регистрация
23.03.2021
Сообщения
87
Реакции
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);
    }
}
 
Способ, конечно тот еще, но так работает:
C#:
Развернуть Свернуть Копировать
while(DateTime.Now<jobTimeStart){
        project.SendInfoToLog("Текущее время: " + DateTime.Now + ". Ждем старта потока: " + Thread.CurrentThread.ManagedThreadId.ToString(),true);
    }

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

конструкция в lock
что это за жесть ? бедный лог.... :bm:
 
что это за жесть ? бедный лог.... :bm:
ага.. жесть та еще. Как правильно сделать?
кстати, это тоже не помогло. 1й поток все равно идет на выполнение, пауза идет только у второго
 
Добрый день! Я, возможно, пишу не там, но увидела, что у Вас (Nelirr) есть наработки по ботам для маркетплейсов (Вайлдбериз). Как можно с Вами связаться?
 

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