1 / 1 / 0
Регистрация: 11.04.2019
Сообщений: 46
.NET 4.x

Создание задержки Task.Delay(...) более чем на Int32.MaxValue миллисекунд

28.03.2021, 14:55. Показов 5462. Ответов 27
Метки c#, delay (Все метки)

Студворк — интернет-сервис помощи студентам
Задался вопросом, можно ли Task.Delay() дать число, большее, чем длина int32?
То есть, можно ли сделать задержку, допустим, на 1000 часов?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.03.2021, 14:55
Ответы с готовыми решениями:

Метод Graphics.DrawLine(Int32, Int32, Int32, Int32) Узнать координаты всех точек данной прямой
Как я могу получить координаты всех точек, создаваемых данных методом? Мне необходимо это в дальнейшем чтобы посчитать количество...

Реализовать функцию задержки на N миллисекунд
У меня есть функция задержки: Public Sub Delay(a As Single) Dim start As Single start = Timer Do While Timer < start + a...

Время задержки delay
Доброго времени суток. столкнулся с AnyLogic University 6.9.0. задача: Есть 3 блока Sourсе. из них выходит по 1 заявке. при выходе каждой...

27
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
29.03.2021, 16:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kolorotur Посмотреть сообщение
добавьте отмену и будет совсем хорошо
Отмену специально не добавлял - уже есть ваша реализация.
Да, и TC'у, как я понял, нужен эквивалент Delay(int).
1
1 / 1 / 0
Регистрация: 11.04.2019
Сообщений: 46
29.03.2021, 17:07  [ТС]
Да, именно это и нужно было, то есть у меня програмка простенькая, и даже если поток почти всегда будет заблокирован, ничего страшного не произойдет
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
29.03.2021, 18:18
Цитата Сообщение от Caesium137 Посмотреть сообщение
Да, именно это и нужно было, то есть у меня программка простенькая
Рассчитанная на непрерывную работу компа более 3-х недель....

Добавлено через 34 секунды
Цитата Сообщение от Caesium137 Посмотреть сообщение
даже если поток почти всегда будет заблокирован,
Второй вариант не блокирует поток.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
30.03.2021, 12:24
Цитата Сообщение от Элд Хасп Посмотреть сообщение
await Task.Delay(int.MaxValue);
учитывая что любая задержка гарантирует только что будет "спать" не меньше указаного, я подозреваю что накопится погрешность на несколько часов. Пруфов в виде тестов не будет.

А теперь серьезно: Task.Delay(new TimeSpan(long.MaxValue)) -- 30тыс. лет.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
30.03.2021, 13:04
Цитата Сообщение от Wolfdp Посмотреть сообщение
А теперь серьезно: Task.Delay(new TimeSpan(long.MaxValue)) -- 30тыс. лет.
При значении более new TimeSpan(int.MaxValue) (3,5 недели) будет исключение ArgumentOutOfRangeException.
См. Task.Delay(TimeSpan).

Добавлено через 10 минут
Цитата Сообщение от Wolfdp Посмотреть сообщение
учитывая что любая задержка гарантирует только что будет "спать" не меньше указаного, я подозреваю что накопится погрешность на несколько часов.
С этим согласен.
Вариант с уменьшенной погрешностью:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static class MyTask
    {
        public static async Task Delay(double interval)
        {
            DateTime endTime = DateTime.Now.AddMilliseconds(interval);
            while (interval > int.MaxValue)
            {
                await Task.Delay(int.MaxValue);
                interval = (endTime - DateTime.Now).TotalMilliseconds;
            }
            if (interval > 0)
                await Task.Delay((int)interval);
        }
    }
Но для ОООчень больших значений может зацикливаться.
Очень большие, это больше чем 283 мс.

Добавлено через 3 минуты
Цитата Сообщение от Wolfdp Посмотреть сообщение
Пруфов в виде тестов не будет.
Ну, что вы...?
Проведите обязательно, хотя бы на зацикливание.

0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
30.03.2021, 17:02
Цитата Сообщение от Wolfdp Посмотреть сообщение
накопится погрешность на несколько часов
Поправьте если я не прав, но чтобы при тике таймера раз в ~25 дней и стандартной десктопной погрешности в 15мс накопить ошибку на несколько часов (за "несколько" возьмем минимальные 3), потребуется где-то полторы сотни миллионов лет +/- 15мс на последний тик.
Думаю, с такими интервалами можно смело прописывать await Task.Delay(-1) и не париться.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,173
Записей в блоге: 2
30.03.2021, 17:15
Цитата Сообщение от kolorotur Посмотреть сообщение
потребуется где-то полторы сотни миллионов лет +/- 15мс на последний тик.
Обязательно нужен тест!

0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
30.03.2021, 17:56
kolorotur, сколько конктретно пройдет лет не считал, но явно МНОГО т.к. для максимального накопления погрешности нужно указать число максимально приближенное или равное long.MaxValue.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
будет исключение ArgumentOutOfRangeException
Неожиданно. Окей, но DateTime.Now не самый лучший кандидат (переводы времени и точность), я бы уже упарывался с Stopwatch (надеюсь он long тянет)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public static async Task Delay(long interval)
        {
            var stopWatch = new Stopwatch();
            stopWatch.Start();
            while (interval > int.MaxValue)
            {
                await Task.Delay(int.MaxValue);
                interval -= stopWatch.ElapsedMilliseconds;
            }
            if (interval > 0)
                await Task.Delay((int)interval);
            stopWatch.Stop();
        }
Добавлено через 30 минут
Тут пришла мудрейшая Хоро и озвучила три момента:
- я идиот, который минусует весь прошедший период от интервала (пример выше не рабочий)
- маюсь непонятно чем
- протестировать погрешность таки можно

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    class Program
    {
        const long delay = 100000;
 
        static void Main(string[] args)
        {
            Test(MyTask.Delay1);
            Test(MyTask.Delay2);
            Console.ReadKey();
        }
 
        static void Test(Func<long, Task> delayMethod)
        {
            var stopWatch = new Stopwatch();
            stopWatch.Start();
            delayMethod(delay).Wait();
            stopWatch.Stop();
            Console.WriteLine($"погрешность {new TimeSpan(stopWatch.ElapsedMilliseconds - delay)}");
        }
    }
 
    public static class MyTask
    {
        //const int MaxValue = int.MaxValue;
        const int MaxValue = 100;
 
        public static async Task Delay1(long interval)
        {
            while (interval > MaxValue)
            {
                await Task.Delay(MaxValue);
                interval -= MaxValue;
            }
            await Task.Delay((int)interval);
        }
 
        public static async Task Delay2(long interval)
        {
            var stopWatch = new Stopwatch();
            stopWatch.Start();
            var n = interval;
            while (n > MaxValue)
            {
                await Task.Delay(MaxValue);
                n = interval - stopWatch.ElapsedMilliseconds;
            }
            if (n > 0)
                await Task.Delay((int)n);
            stopWatch.Stop();
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.03.2021, 17:56

Использование Task Delay
Может кто подскажет ,как правильно использовать метод Task.Delay в C++/CLI Когда пишу Task.Delay(500) компилятор выдает ошибку ...

Метод Delay в Task
Привет всем. В общем отправляю я запрос с помощью таск. И все работает, только иногда ответ от сервера не приходит, и поэтому метод...

Atmega2560, конфликт UART и задержки (delay)
В общем, есть STK600, нужно реализовать таймер обратного отсчета: по UART принимается строка вида HH:MM:SS, дальше идет обработка,...

Task.Delay отказывает в работе
public static async void randr_sleep(TextEdit e, decimal min, decimal max, bool a) { if (!a) return; ...

Разное время задержки Delay для разных заявок
Здравствуйте.Подскажите пожалуйста,как выполнить такое: с одного источника выходят 2 наименования деталей,каждое наименование по 30 шт....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru