Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 11.04.2019
Сообщений: 46
.NET 4.x

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

28.03.2021, 14:55. Показов 5353. Ответов 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
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 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
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 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
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 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
 Аватар для Элд Хасп
16151 / 11272 / 2890
Регистрация: 21.04.2018
Сообщений: 33,146
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов. В Main создаём четыре события. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru