Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/103: Рейтинг темы: голосов - 103, средняя оценка - 4.64
3 / 3 / 1
Регистрация: 31.01.2013
Сообщений: 108
1

Разница между Thread.Sleep и await Task.Delay

13.09.2019, 11:56. Показов 19763. Ответов 5
Метки нет (Все метки)

Здравствуйте!
Плохо понимаю разницу между использованием:

C#
1
2
Thread.Sleep(1000);
//Здесь код после задержки
и

C#
1
2
3
4
5
Task.Factory.StartNew(async () =>
{
      await Task.Delay(1000);
//Здесь код после задержки
});

Я конечно давно понял, что Thead.Sleep блокирует текущий поток. А там где используется async/await текущий поток не блокируется, и асинхронно вызывается код.

Но в чем именно разница при использовании того или другого способа приведенного выше, если они работают одинаково?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2019, 11:56
Ответы с готовыми решениями:

Аналог Thread.Sleep или Task.Delay
Есть ли какой-нибудь аналог функциям Thread.Sleep или Task.Delay ? Мне необходимо сделать задержку...

Async/await или разница между 2 методами
Добрых времени суток. Есть асинхронный метод: public Task<List<Address>> GetAllByStreet(string...

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

Как реализовать выход при условие=1 из Task.Delay(-1)?
Есть асинхронный таск, который подписывается на ивент, затем идёт бесконечное ожидание. Для...

5
1114 / 785 / 219
Регистрация: 15.08.2010
Сообщений: 2,166
13.09.2019, 12:39 2
Igorokmen, как они могут работать одинаково, если вы сами написали, что один блокирует, а второй нет.
На практике слип в форме не даст двигать ее по экрану, дилей напротив, можно делать что угодно
1
214 / 148 / 48
Регистрация: 28.12.2016
Сообщений: 716
14.09.2019, 09:11 3
Если Task.Delay(x).Wait(); то разницы особой не будет.
Если же через async/await, то Sleep блокирует поток, а Delay ожидает.
1
75 / 44 / 17
Регистрация: 11.03.2013
Сообщений: 525
Записей в блоге: 4
14.09.2019, 23:54 4
Лучший ответ Сообщение было отмечено Igorokmen как решение

Решение

Цитата Сообщение от Igorokmen Посмотреть сообщение
Плохо понимаю разницу
C#
1
Thread.Sleep(1000);
Заставляет спать основной поток (синхронно выполняется с основным потоком) на n количество времени, и спать будет Ваш главный поток, где главная точка в процедуру, как правильно Вы подметили программа зависла. Бывает полезно тормознуть основной поток (когда например) работает другая программа и может повлиять на работу Вашей программы (к примеру скрипт CMD)

C#
1
await Task.Delay(1000);
await Ждёт завершения задачи. А Task.Delay это всего лишь время задержки.
Бывает полезно когда нужно посмотреть что происходит в цикле (как пример)
В видео я показал как работает цикл, с задержкой 1 мс, 150мс, и 1000мс (1сек)


Вот так это работает

C#
1
2
3
4
5
6
7
8
9
10
11
async private void AutoCrypt_Click(object sender, EventArgs e)
        {
            string a = tbSource.Text;
            tbSource.Text = string.Empty;
            for(i= 0; i < 1000000; i++)
            {
                tbCycle.Text = i.ToString();
                tbResultCrypt.Text = Crypt(a);
                await Task.Delay(Convert.ToInt32(tbMS.Text));
            }
        }
1
4 / 4 / 1
Регистрация: 30.09.2015
Сообщений: 17
14.10.2019, 18:53 5
C#
1
await Task.Delay(1000);
По факту, тут тоже поток спит, но другой асинхронный из пула.
1
Эксперт .NET
15314 / 11608 / 3044
Регистрация: 17.09.2011
Сообщений: 19,431
15.10.2019, 01:42 6
Цитата Сообщение от DmitryB84 Посмотреть сообщение
По факту, тут тоже поток спит, но другой асинхронный из пула.
Кто ж в здравом уме будет такую реализацию таймера делать?
Они через аппаратные прерывания реализованы.

Обработчик срабатывания — да, выполняется в потоках пула.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2019, 01:42

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Аналог Thread.Sleep
когда вызываешь функцию Вызываю слип в потоке Thread.Sleep(300000) ТО программа начинает криво...

GetPixel в связке Thread.Sleep
Здравствуйте. Считываю цвет необходимого мне пикселя из игры. Код считывания собственно...

Прервать ожидание Thread.Sleep
Можно ли прервать ожидание Thread.Sleep? У меня сейчас в отдельном потоке выполняется некий код,...

Поговорим про Task и Thread
1) Объекты синхронизации, которые были в Thread актуальны для Task? 2) Изменились ли как-то эти...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.