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

Асинхронный стрим

17.03.2021, 22:43. Показов 1211. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пример асинхронного стрима из метанита
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
 
namespace HelloApp
{
    class Program 
    {
        static async Task Main(string[] args)
        {
            await foreach (var number in GetNumbersAsync())
            {
                Console.WriteLine(number);
            }
        }
 
        public static async IAsyncEnumerable<int> GetNumbersAsync()
        {
            for (int i = 0; i < 10; i++)
            {
                await Task.Delay(100);
                yield return i; 
            }
        }
    }
}

Я так и не смог увидеть тут проявление асинхронности. Пока foreach не переберет все элементы управление находится в foreach. Что и где тут может выполняться пока идет "работа" по получению очередного элемента в методе GetNumbersAsync()? То есть, где тут плюсы асинхронности?
Или по другому - как изменить пример, чтобы асинхронность была очевидной?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2021, 22:43
Ответы с готовыми решениями:

Стрим в richtextbox
Доброго времени суток. Подскажите как открыть файл по нажатию кнопки (без диалога, просто путь, у меня постоянно ошибка формата вылезает...

Стрим транслируем на виртуальную камеру
Надо каким-то простым способом ретранслировать стрим на вебкамеру ноутбука. У меня есть ссылка на видеострим, ссылка заканчивается...

Видео лайв стрим рабочего стола от сервера к клиенту
Занимаемся разработкой клиента для геймстриминга. Один пк делится на 12 рабочих мест. Все места заранее настроены и конфигурации для...

2
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
17.03.2021, 22:59
titan4ik, сравните с версией, где сначала формируется массив, а потом возвращается:
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
static async Task Main(string[] args)
        {
 
            var st = new System.Diagnostics.Stopwatch();
            st.Start();
            foreach(var n in await GetNumbers())
            {
                Console.WriteLine(n);
            }
 
            st.Stop();
            Console.WriteLine($"Non IAsyncEnumerable: {st.ElapsedMilliseconds}");
 
            st.Restart();
            await foreach (var number in GetNumbersAsync())
            {
                Console.WriteLine(number);
            }
            st.Stop();
            Console.WriteLine($"IAsyncEnumerable: {st.ElapsedMilliseconds}");
            
            Console.ReadLine();
        }
 
        public static async Task<IEnumerable<int>> GetNumbers()
        {
            var mas = new int[10];
            for (int i = 0; i < 10; i++)
            {
                await Task.Delay(100);
                mas[i] = i;
            }
 
            return mas;
        }
 
        public static async IAsyncEnumerable<int> GetNumbersAsync()
        {
            for (int i = 0; i < 10; i++)
            {
                await Task.Delay(100);
                yield return i;
            }
        }
По времени примерно одинаково, но IAsyncEnumerable выстреливает значением сразу по мере итерирования.
В этом и есть его преимущество, что-то вроде Data streaming-а.
PS: мне вообще последние шарповские фичи нравятся - помимо этой, еще nullable reference types может быть очень удобным во время разработки.
1
Заблокирован
18.03.2021, 00:01  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
еще nullable reference types может быть очень удобным во время разработки
спасибо, это я погуглю. Одна беда - чтобы пользоваться всей этой магией c# нужно постоянно всем этим пользоваться, а то забывается всё, если с перерывами большими программировать)
А по основной теме:
Это хорошо, что он выплевывает очередной элемент сразу после расчета (кстати, по порядку выдаёт). То есть асинхронность только в этом? В том что очередной элемент выдается сразу после его расчета?
Но пока все элементы не рассчитаны, что толку от асинхронности? Управление же все-равно в цикле await foreach. Или нет?
По крайней мере, пока await foreach не переберет все элементы код после await foreach не выполняется.
По идее, асинхронность должна освобождать поток, в котором вызван асинхронный метод. Какой поток тут освобождается? Я этого пока не понимаю)
Ааа..., может быть нужно сделать ещё один отдельный асинхронный метод с await foreach и тогда при его вызове в неком потоке он вернет управление этому потоку, пока не выплюнет все элементы? Но это будет общая асинхронность всего цикла await foreach. А правильно было бы, чтобы управление возвращалось в поток вызова пока готовятся элементы, но как только очередной элемент готов, чтобы он вылетал в этот поток и потом опять управление передавалось бы в поток вызова. Не понятно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2021, 00:01
Помогаю со студенческими работами здесь

Асинхронный чат
Есть клиент-сервер приложение. В самом примитвном варианте: клиент шлет строку, и через некоторое время может ее запросить. Как без...

Асинхронный метод
Есть программа, архивирует видео-файлы с целью бэкапа, запускается каждый день в 20.00. Сейчас есть необходимость добавить ручной запуск....

Асинхронный void
На различных форумах очень часто встречал фразу &quot;void и await не лучшее сочетание&quot;. Проблема следующая: По нажатию на кнопку создаём...

Асинхронный сервер
Интересует такая тема: Мне нужно реализовать сервер на C#, который будет получать запрос от клиента(json), а после этого будет проводить...

асинхронный сервер
Не могу определить выполняется ли метод в отдельном потоке имеется код public ClientConnection(Socket AcceptedSocket) ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru