-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAsyncAndAwaitEasyTask.txt
More file actions
96 lines (76 loc) · 5.37 KB
/
AsyncAndAwaitEasyTask.txt
File metadata and controls
96 lines (76 loc) · 5.37 KB
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Задание: "Асинхронная кулинарная книга"
Контекст
Представь, что ты разрабатываешь приложение для управления кухней.
Некоторые процессы занимают время (варка, жарка, запекание),
и их нужно выполнять асинхронно, чтобы кухня работала эффективно.
Что нужно сделать
Создай консольное приложение, которое эмулирует работу кухни с использованием async/await.
- public class Chef:
Реализуй эти async методы:
1. CookPastaAsync() Простой асинхронный метод
- Варка пасты занимает 3 секунды
- Выведи сообщение "Начинаю варить пасту"
- Подожди 3 секунды асинхронно
- Выведи сообщение "Паста готова!"
2. Task<string> PrepareSauceAsync() Асинхронный метод с возвратом значения
- Приготовление соуса занимает 2 секунды
- Выведи сообщение "Готовлю томатный соус"
- Подожди 2 секунды
- Верни строку "Томатный соус"
3. Task<string[]> PrepareSaladAsync() Параллельное выполнение (Task.WhenAll)
- Создай три задачи для нарезки:
- Нарезка помидоров (1 сек) -> "Помидоры"
- Нарезка огурцов (1.5 сек) -> "Огурцы"
- Нарезка перца (1 сек) -> "Перец"
- Используй Task.WhenAll для параллельной нарезки
- Верни массив результатов
- Подсказка: var tasks = new[] { ChopTomatoesAsync(), ... }
4. BakeMeatAsync() Обработка ошибок
- Используй try-catch
- В try:
- Выведи сообщение "Запекаю мясо"
- Подожди 4 секунды
- С вероятностью 30% выбрось исключение "Духовка сломалась!"
- В catch:
- Обработай ошибку: выведи сообщение "Неудача: " + ex.Message
- Затем подожди 1 секунду (готовим на сковороде как запасной вариант)
- Выведи сообщение "Мясо готово на сковороде!"
5. CookDinnerAsync() Метод для демонстрации последовательного vs параллельного выполнения
- Организуй приготовление ужина:
1. Начни варить пасту (CookPastaAsync)
2. Параллельно с пастой готовь соус и салат (Task.WhenAll)
3. После пасты начни запекать мясо (BakeMeatAsync)
- Засеки время выполнения с помощью Stopwatch
- Stopwatch sw = new Stopwatch();
- sw.Start();, sw.Stop();
- Выведи общее время приготовления (int)sw.Elapsed.TotalSeconds
6. Вспомогательные методы
1. Task<string> ChopTomatoesAsync() Ждет 1000мс и возвращает "Помидоры"
2. Task<string> ChopCucumbersAsync() Ждет 1500мс и возвращает "Огурцы"
3. Task<string> ChopPeppersAsync() Ждет 1000мс и возвращает "Перец"
- Метод async Task Main(string[] args)
- Выведи сообщение "Кухня открывается! Начинаем готовить обед...\n"
- Создай асинхронный шеф-повара
- Chef chef = new Chef();
- await chef.CookDinnerAsync();
- Выведи сообщение "\nКухня закрывается. Обед готов!"
Дополнительные задания:
1. Прогресс-бар: Добавь отображение прогресса приготовления (IProgress<T>)
2. Отмена операции: Добавь возможность отменить приготовление через 5 секунд (CancellationToken)
3. Кухонный комбайн: Создай метод, который готовит несколько блюд одновременно и собирает результаты
Ожидаемый результат
Приложение должно выводить что-то похожее:
Кухня открывается! Начинаем готовить обед...
Начинаем готовить ужин...
Начинаю варить пасту
Готовлю томатный соус
Нарезаю овощи для салата
Паста готова!
Соус готов
Салат готов: Помидоры, Огурцы, Перец
Запекаю мясо
(возможна ошибка)
Неудача: Духовка сломалась!
Мясо готово на сковороде!
Общее время приготовления: 6.5 сек
Кухня закрывается. Обед готов!