Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/57: Рейтинг темы: голосов - 57, средняя оценка - 4.96
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Task и async-await

28.05.2019, 09:45. Показов 13551. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните пожалуйста, в чем преимущество async-await? И в чем разница между обычной задачей? Ведь задачи то же выполняются независимо друг от друга и используя их, мы например можем не блокировать UI поток? И ведь async-await вроде как и построены на задачах. Когда стоит применять async-await, а когда TPL? И опять же, асинхронность не есть многопоточность, а ведь TPL позволяет создавать отдельные потоки и пуллы потоков. В общем как-то запутался.
На примере простого кода:

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
 internal class Program
    {
        private static void Factorial(int value = 6)
        {
            int result = 1;
            for (int i = 1; i <= value; i++)
            {
                result *= i;
            }
            Thread.Sleep(8000);
            Console.WriteLine($"Факториал равен {result}");
        }
 
        private static async void FactorialAsync()
        {
            Console.WriteLine("Начало метода FactorialAsync");
            await Task.Run(() => Factorial());
            Console.WriteLine("Конец метода FactorialAsync");
        }
 
        private static Task Factor()
        {
            return Task.Run(() => Factorial());
        }
 
        private static void Main(string[] args)
        {
            FactorialAsync();   // вызов асинхронного метода
            Factor();
            Console.WriteLine("Введите число: ");
            int n = int.Parse(Console.ReadLine());
 
            Console.WriteLine($"Квадрат числа равен {n * n}");
 
            Console.Read();
        }
    }
В чем разница работы методов
C#
1
2
private static async void FactorialAsync();
private static Task Factor();
Какой вариант предпочтительнее в данном случае.
И да, второй метод если выполнить в таком стиле?
C#
1
2
3
4
  private static async Task Factor()
        {
            await Task.Run(() => Factorial());
        }
Что это даст?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.05.2019, 09:45
Ответы с готовыми решениями:

Многопоточность с async/await и Task
Помогите разобраться с многопоточностью, совсем запутался после чтения множества статей. Нужно использовать async/await или таски. ...

Потоки, мультипоточность Task or Async/Await or ThreadPool?
Здравствуйте форумчане. Я очень нуждаюсь в вашей помощи. Я реализовываю парсер с одного довольно популярного сайта занятости и...

Async/ await как правильно ввести данные в async метод (консоль)
Привет , кто то может помочь ?) проблема в тому что у меня есть async метод который запускается из Main, по среди этого метода...

21
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
22.06.2021, 19:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Рядовой Посмотреть сообщение
его и оставляют ждать действий пользователя.
вот - вы меня расшифровали... а отправить Cancellation-просьбу -- может пригодится оттуда...
==
в общем, даже без async Task Main() можно сделать Cancellation достаточно гуманно... в class Program:
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
        static readonly CancellationTokenSource cts = new CancellationTokenSource();
 
        public static void Main(string[] args)
        {
            //CancellationTokenSource cts = new CancellationTokenSource();
            CancellationToken token = cts.Token;            
            
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            
            Task t =SumPageSizesAsync(token); 
            Console.WriteLine("Press the ENTER key to cancel...");
            // NON-BLOCKING
            while (Console.ReadKey().Key != ConsoleKey.Enter)
            {
                Console.WriteLine("Press the ENTER key to cancel...");
            }
            cts.Cancel();
            Console.WriteLine("\nENTER key pressed: cancelling downloads.\n");
                        
            Console.Write("Press any key to continue . . . \n\n");
            Console.ReadKey(true);
        }
 
        static async Task SumPageSizesAsync(CancellationToken token)
        {
            var stopwatch = Stopwatch.StartNew();
 
            IEnumerable<Task<int>> downloadTasksQuery =
                from url in s_urlList
                select ProcessUrlAsync(url, s_client, token);
 
             // ........ как раньше
        }
 
        static async Task<int> ProcessUrlAsync(string url, HttpClient client, CancellationToken token)
        {
            HttpResponseMessage response = await client.GetAsync(url, token);
            byte[] content = await response.Content.ReadAsByteArrayAsync();
            Console.WriteLine(@"{0} {1}", url, content.Length.ToString());
 
            return content.Length;
        }
хоть и main не получает доступа к Console (вероятно, т.к. Console не синхронизирована), но Cancellation-ENTER-Click отлавливает...
P.S.
хотя мне ближе такие варианты или по-простому
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
22.10.2025, 20:36
Цитата Сообщение от Cupko Посмотреть сообщение
У меня, когда речь идет об async/await, всегда тянется ладонь к лицу. Люди фигачат непонятные никому примеры, рассказывают о магических стейт-машинах, и мне, даже имея многолетний опыт, ничего не понятно.
о стэйт-машинах - это уже компилятор - на каждый await метод генерирует state machine, помещая в неё метод для выполнения асинхронно... если нет await'а (там, где он нужен) - даже ошибку при сборке выдаст о IStateMachine ...

в любом случае, всегда смущает момент -
If an awaited task is not completed, the logic relies on a lot of helper types to get the job done
- чтобы быть уверенной, что асинхронный поток сам закроется спокойно...

или несколько в IAsyncEnumerable (c C#8.0 и .NET Core 3.0 ) или System.Linq.AsyncEnumerable (c C#10.0)

p.s. в "Паттерны проектирования для C# и платформы .NET Core", Арораа Гаурав, Чилберто Джеффри - хорошо показаны модульные тесты для race condition
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.10.2025, 20:36

async/await (._. )
Опять я с глупым вопросом. Не могу понять, почему метод, который выгружает данные не асинхронный? Вообще форма зависает на неопределенное...

Async/await
В интернете копался ничего информативного не нашел, все в каких- то не понятных для новичка терминах, объясните пожалуйста смысл...

Async await
Пытыюсь разобраться с async/await но что то без успешно пока. Не подскажете как переделать этот код на примере проще освоить public...

Работа с async await
Добрый вечер. Помогите исправить код. Мне нужно сделать поиск по реестру, например ввожу слово Console, программа должна получить все имена...

Async await, использование
Знатоки, есть ли разница между написанием? Я где-то читал, что второй способ хуже, ибо создается IO поток и CPU, а в первом только IO ...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru