Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 30

Ещё раз про асинхронность

24.08.2016, 19:38. Показов 2255. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скажите пожалуйста, зачем в данном случае использовать асинхронность, когда и синхронное выполнение даёт такой же результат?То есть консоль пишет "ID нынешнего потока (10, к примеру)", Ждёт секунду, пишет "ID await (12, к примеру)". Потом пишет "конец веселья". Так если асинхронность предполагает неблокирующий способ, тогда почему она блокирует нынешний поток , пока не завершится await метод?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class myClass
    {
        public async void MyMethodAsync()
        {
            Console.WriteLine("ID нынешнего потока " + Thread.CurrentThread.ManagedThreadId);
            await Task.Run(
             () =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("ID await " + Thread.CurrentThread.ManagedThreadId);
            });
            Console.WriteLine("конец веселья");
        }
        static void Main(string[] args)
        {
            myClass mc = new myClass();
            mc.MyMethodAsync();
            Console.ReadKey();
        }
    }
не понимаю, в чём смысл асинхронности, когда можно вызвать другой поток посредством Thread
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2016, 19:38
Ответы с готовыми решениями:

Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот символ
Помогите с задачей на C# Ввести строку символов. Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот...

Еще раз о перегрузке оператора ++
Привет. Прочитал аналогичные темы на форуме. И все равно не получается: Реализую перегрузку оператора ++ class Triangle ...

Выгрузить в Excel данные еще раз
Добрый день! Я выгружаю данные из sql server в excel. Все проходит без проблем, но если нажать второй раз на кнопку, то выскакивает...

7
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
24.08.2016, 20:05
Цитата Сообщение от denprised Посмотреть сообщение
тогда почему она блокирует нынешний поток
=> await Task.Run
Потому что вы вызываете его с ключевым словом await, словно говорите "Запусти-ка мне этот асинхронный код синхронно".
await, собственно, и переводится как "ожидать".

Цитата Сообщение от denprised Посмотреть сообщение
Так если асинхронность предполагает неблокирующий способ
Неблокирующим является сам метод MyMethodAsync, вы это увидите, если уберете Console.ReadKey() в методе Main.
0
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 30
24.08.2016, 20:11  [ТС]
Ну если как вы говорите "Запусти-ка мне этот асинхронный код синхронно", тогда почему ID не совпадают?он же создает новый поток?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
24.08.2016, 20:20
Цитата Сообщение от denprised Посмотреть сообщение
тогда почему ID не совпадают?
Цитата Сообщение от denprised Посмотреть сообщение
он же создает новый поток?
Используется уже готовый поток из пула. Task.Run берет другой поток из пула потоков и запускает в нем задачу, заставляя вызывающий поток ждать его завершения. Так и должно быть, что ID разные.
0
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 30
24.08.2016, 20:28  [ТС]
Ничего не понимаю, тогда зачем вообще асинхронность?если мы ждём, пока не выполнится метод?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
24.08.2016, 20:53
Цитата Сообщение от denprised Посмотреть сообщение
тогда зачем вообще асинхронность?
Асинхронно выполняется метод, помеченный словом async, (догадайтесь, как можно перевести это слово на русский ), при условии, что он вызывается без ключевого слова await из клиентского кода, как в вашем методе Main.

Это просто требования работы с async/await: если вы хотите сделать код асинхронным, просто помечаете нужный метод для этого словом async, но в теле метода должно присутствовать ключевое слово await.

В чем плюсы? Асинхронный код с async/await также легко пишется и читается, как синхронный.

Например, взять ту же работу с GUI в Win Forms.
Допустим, есть обработчик нажатия кнопки:
C#
1
2
3
4
5
private void btnAny_Click(object sender, EventArgs e)
{
     var res =  SomeVeryExpensiveOperation(); // 
     label1.Text = res.ToString();
}
Форма тут будет очень долго виснуть во время выполения метода SomeVeryExpensiveOperation, поскольку метод btnAny_Click выполняется в GUI потоке. Для решения надо просто создать Task-обертку для SomeVeryExpensiveOperation и пометить обработчик словом async:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private async void btnAny_Click(object sender, EventArgs e)
{
     var res = await SomeVeryExpensiveOperation(); // 
     label1.Text = res.ToString();
}
 
// TResult - тип, возвращаемый методом SomeVeryExpensiveOperation
private Task<TResult> SomeVeryExpensiveOperationAsync()
{
    return Task.Run(()=>{
           return  SomeVeryExpensiveOperation();
   });
}
Профит: GUI не виснет, и мы почти ничего не написали. + читается также легко.

Добавлено через 6 минут
Вместо await SomeVeryExpensiveOperation(); написать await SomeVeryExpensiveOperationAsync();, конечно же.
0
4 / 2 / 2
Регистрация: 21.07.2015
Сообщений: 12
24.08.2016, 21:10
denprised, Возможно вы немного не так поняли работу async\await.
Code
1
Оператор await применяется к задаче в асинхронных методах, для того, чтобы приостановить выполнение метода до тех пор, пока ожидаемая задача не завершится.
То есть в вашем коде, вызывая метод MyMethodAsync будет происходить создание новой задачи и ожидание её выполнения. Другими словами выполнение метода прервётся до тех пор, пока не пройдёт секунда,
но при этом вызывающий код ( метод Main ) продолжит свой выполнение. Это вы можете проверить вот таким кодом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            public async void MyMethodAsync()
            {
                Console.WriteLine("Метод MyMethodAsync - до запуска задачи");
                await Task.Run(
                 () =>
                 {
                     Console.WriteLine("Метод MyMethodAsync - задача запущена. Ждём 5 секунд");
                     Thread.Sleep(5000);
                     Console.WriteLine("Метод MyMethodAsync - завершение выполнения задачи");
                 });
                Console.WriteLine("Метод MyMethodAsync - выполнение задачи завершено");
 
            }
            static void Main(string[] args)
            {
                myClass mc = new myClass();
                Console.WriteLine("Метод Main - до запуска задачи");
                mc.MyMethodAsync();
                Console.WriteLine("Метод Main - после запуска задачи");
                Console.ReadKey();
            }
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,307
25.08.2016, 02:28
denprised, тут, как бы, всё просто: после mc.MyMethodAsync(); добавь вывод чего-нибудь на экран и тебе сразу всё станет ясно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.08.2016, 02:28
Помогаю со студенческими работами здесь

С#/Структуры вложенные/Marshal еще раз объясните?
Здравствуйте. Код примерно такой: ... public unsafe struct def_ { public short flag;

Определите, встречается ли первое слово еще раз
Здравствуйте, нужно считать текст с .doc файла,чтобы узнать сколько раз повторялось 1 слово. Заранее спасибо.

Еще раз про цветы)
У меня есть 2Д массив данных (нек-рое изображение в цифирях от 0 до Х), как из него сделать ч/б изображение (bmp или jpeg и тд). Я...

Ещё раз про сокеты
Вернулся к вопросу о создании сокет сервера Вот взял примерчик из сети // set some variables $host = “192.168.1.99”; $port =...

Еще раз про MC34063
Здравствуйте! Рассчитываю запитать от DC-DC нагрузку 3.3В, 0,25 А (максимум). Рассчитал по ссылке...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru