Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/42: Рейтинг темы: голосов - 42, средняя оценка - 4.52
HF
 Аватар для HF
1311 / 889 / 200
Регистрация: 09.09.2011
Сообщений: 2,627
Записей в блоге: 2

Асинхронные события уже доступны?

19.07.2021, 10:24. Показов 8467. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Внезапно обнаружил что можно у событий ставить маркер "async" и методы замечательно работают.

C#
1
2
3
4
private async void button_Click(object sender, EventArgs e)
{ 
     await Action();
}
Вопрос 1: Попытался найти упоминания, когда это добавили. Не видел новостей "когда async подвезли".
Вопрос 2: Так как я не могу найти подробного ответа по вопросу 1, то возник вопрос - это так любые методы событий можно перевести в async? или же всё-таки есть какие-то ограничения.

Уже продолжение мыслей. Если они по умолчанию доступны во всех реализациях, то не проще ли будет сразу, при разработке, всё маркировать. Много ресурсов это вроде бы не должно выделять, а вот польза должна быть.

Добавлено через 11 минут
Нашёл только одну интересную статейку.
https://www.programmersought.c... 725055430/

Control.ы имеют интерфейс ISyncronizeInvoke (оно и понятно) с асинхронными методами. Видимо это сразу и даёт возможность события контролов вызывать двумя методами. Тогда теоритически для не-контролов это не сработает. Например события биндингсурса и т.п.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.07.2021, 10:24
Ответы с готовыми решениями:

Как проверить, назначен ли уже обработчик события?
День добрый Вот хотел узнать, как можно проверить следующее: //Вот где-то делается.. Ok.Click += new...

Зачем нужны события, когда уже есть делегаты?
Сабж. Зачем создавать событие(event), привязывать его к делегату и добавлять слушателей к событию, когда можно сразу добавить слушателей...

Ошибка, что база уже открыта oткрыть Exclusive уже неудaется.
Еслй етoт пример пoстaвить в цикл (типo пoвтoряетсья через 1 мин.), тo через кaкиx тo 25 - 35 рaзoв видoет oшибку, чтo бaзa уже oткрытa и...

10
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18259 / 14184 / 5366
Регистрация: 17.03.2014
Сообщений: 28,870
Записей в блоге: 1
19.07.2021, 14:50
Лучший ответ Сообщение было отмечено HF как решение

Решение

Цитата Сообщение от HF Посмотреть сообщение
Вопрос 1: Попытался найти упоминания, когда это добавили. Не видел новостей "когда async подвезли".
В C# 5.0. Девять лет назад.

Добавлено через 2 минуты
Цитата Сообщение от HF Посмотреть сообщение
Вопрос 2: Так как я не могу найти подробного ответа по вопросу 1, то возник вопрос - это так любые методы событий можно перевести в async? или же всё-таки есть какие-то ограничения.
Нет ограничений.

Цитата Сообщение от HF Посмотреть сообщение
Если они по умолчанию доступны во всех реализациях, то не проще ли будет сразу, при разработке, всё маркировать.
Не надо. Компилятор дает предупреждение на async методы без await-ов. Ставьте там где это нужно.

Цитата Сообщение от HF Посмотреть сообщение
Control.ы имеют интерфейс ISyncronizeInvoke (оно и понятно) с асинхронными методами.
Это совсем про другое.
1
HF
 Аватар для HF
1311 / 889 / 200
Регистрация: 09.09.2011
Сообщений: 2,627
Записей в блоге: 2
19.07.2021, 15:12  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В C# 5.0. Девять лет назад.
Про сам async я в курсе. Но почему-то пропустил момент что именно у методов они стали доступны тоже.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18259 / 14184 / 5366
Регистрация: 17.03.2014
Сообщений: 28,870
Записей в блоге: 1
19.07.2021, 15:39
HF, нужно больше читать значит. Потому что async void обязательно всплывает при обсуждении чего нужно избегать при написании async/await кода, с поясненями когда это все-таки допустимо.

Добавлено через 2 минуты
Например - Async/Await - Best Practices in Asynchronous Programming
0
Эксперт .NET
 Аватар для Usaga
14122 / 9341 / 1350
Регистрация: 21.01.2016
Сообщений: 35,099
21.07.2021, 06:26
Цитата Сообщение от HF Посмотреть сообщение
Но почему-то пропустил момент что именно у методов они стали доступны тоже.
Встречный вопрос: а у чего, кроме методов, они вообще доступны?
0
HF
 Аватар для HF
1311 / 889 / 200
Регистрация: 09.09.2011
Сообщений: 2,627
Записей в блоге: 2
21.07.2021, 08:32  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Встречный вопрос: а у чего, кроме методов, они вообще доступны?
Подозреваю что мой вопрос выглядел глупо, хотя я знаю даже ответ на него. Но видимо смысл был не понят.
Конечно у методов, конечно async был ещё в C#. Речь именно про события.
Объясню. Чтобы создать событие реакции на клик мышкой (например), мы добавляем событие в форму через +=. Но, в отличие от методов, мы же не можем вызвать их через "+= await EventMethod". Приложение их само вызывает. И вдруг (для меня) стало открытием что я просто могу у них добавить этот дескриптор и ... метод события "превратился в async метод". Но опыт показал что никакой пользы это (мне лично в моей программе) не приносит. Всё работает в основном потоке, окно блокируется. Полностью переписанная асинхронная цепочка разблокировала интерфейс, но всё равно где-то "затыкается".
Это я к чему. Первая версия просто вызывала Task.Run из события и работала идеально и не нужно было рефакторить половину проекта.
Потом я вспомнил про ASP.NET, там тоже к контроллерам async добавили. Польза примерно такая же.
Пока что я сделал вывод - хочешь асинхронности - создай сам и управляй (таски, пулы и т.п.). А эта работа этой автоматизации ещё для меня под вопросом.
0
Эксперт .NET
 Аватар для Usaga
14122 / 9341 / 1350
Регистрация: 21.01.2016
Сообщений: 35,099
21.07.2021, 09:03
Цитата Сообщение от HF Посмотреть сообщение
И вдруг (для меня) стало открытием что я просто могу у них добавить этот дескриптор и
Так обработчик события есть самый обычный метод. Что вас тут удивило?)

Цитата Сообщение от HF Посмотреть сообщение
Но опыт показал что никакой пользы это (мне лично в моей программе) не приносит. Всё работает в основном потоке, окно блокируется. Полностью переписанная асинхронная цепочка разблокировала интерфейс, но всё равно где-то "затыкается".
А вот такого не должно быть. Значит вы что-то не так сделали.
0
 Аватар для Andrey-MSK
3319 / 2206 / 387
Регистрация: 14.08.2018
Сообщений: 7,421
Записей в блоге: 4
21.07.2021, 09:09
Цитата Сообщение от HF Посмотреть сообщение
Всё работает в основном потоке, окно блокируется.
Если правильно понял, то методы нужно объявлять примерно так:
C#
1
public async Task<T> SomeMethod() {}
void объявляется так
C#
1
public async Task SomeMethod() {}
и вызывать его потом так
C#
1
await Task.WhenAny(SomeMethod())
Тогда не будет вешать основной поток, поток просто будет ждать выполнения этого метода, а в это время можно делать что нибудь еще.

Асинхронное программирование с использованием ключевых слов async и await
0
HF
 Аватар для HF
1311 / 889 / 200
Регистрация: 09.09.2011
Сообщений: 2,627
Записей в блоге: 2
21.07.2021, 09:18  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
А вот такого не должно быть. Значит вы что-то не так сделали.
Там длинная история, не показать. Но задача такая:
- парсинг файла
- диалог, одна кнопка старт и прогресс бар
- чтобы отображать прогресс бар, нужно файл читать построчно.
Раньше,
- запускал в task.run метод
- который вызывает сервис
- который грузит файл в Enumerable
- и парсит эти строки
- возвращая другую коллекцию.

Я решил переделать всё на async. В итоге уткнулся на File.ReadAllLines. Пришлось и его переписать на ReadAllLinesAsync, но он возвращает IAsyncEnumerable. Можно конечно снова завернуть в IEnumerable, но тогда какой толк если не пользоваться async, Но IAsynEnumerable нельзя вернуть методом. Ну и дальше всё тоже пошло по такой же цепочке. Везде появились "async foreach".
Диалог перестал блокироваться, но в какой-то момент (например при половине загруженного) тоже перестаёт отвечать.
Просто ради "спортивного интереса" хочу достичь нормального результата, но эта глупость с async мне не нравилась. В итоге просто всё приложение должно быть покрыто этими дескрипторами.

Добавлено через 3 минуты
А ну да. Ключевая проблема - желание отображать прогресс бар. Если отключить это, то диалог не блокируется.
Поэтому пока я считаю что или ещё ньюанс как легко обрабатывать IAsyncEnumerable (а я не знаю), или усложнённый процесс (await foreach) работы с IAsyncEnumerable даёт подобные блокировки в переключении контекста.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Значит вы что-то не так сделали.
Именно в этом я и пытаюсь разобраться.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18259 / 14184 / 5366
Регистрация: 17.03.2014
Сообщений: 28,870
Записей в блоге: 1
21.07.2021, 12:36
Цитата Сообщение от HF Посмотреть сообщение
В итоге уткнулся на File.ReadAllLines. Пришлось и его переписать на ReadAllLinesAsync, но он возвращает IAsyncEnumerable.
Вариант со StreamReader не пробовали?
C#
1
2
3
4
5
6
7
8
using (var reader = new StreamReader("file.txt"))
{
    string line;
    while ((line = await reader.ReadLineAsync()) != null)
    {
        // Обработка
    }
}
0
HF
 Аватар для HF
1311 / 889 / 200
Регистрация: 09.09.2011
Сообщений: 2,627
Записей в блоге: 2
21.07.2021, 14:12  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Вариант со StreamReader не пробовали?
Он так и сделан. Я ошибся в примере, не ReadAllLinesAsync а конечно ReadLineAsync. И дальше yield return строк и проброс progress значения.
ReadAllLinesAsync используется для без поддержки прогресса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2021, 14:12
Помогаю со студенческими работами здесь

Текстовой файл с уже введенным текстом зашифровать и вывести уже зашифрованный
Здравствуйте.Задание -шифр Виженера. Вроде код написал,но есть ошибки.Задание заключается в том,чтобы текстовой файл с уже введенным...

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

Асинхронные методы
Здравствуйте, использую VkNet, есть у меня запрос к api vk, а именно messages.search for (int i = 0; i &lt; listBox1.Items.Count; i++) ...

Асинхронные делегаты
Здравствуйте ! Подскажите пожалуйста, (программа рабочая ) для чего в методе public bool Factorize строки : if (m1 ==...

асинхронные делегаты
Добрый день. Вопрос мой об ассинронных делегатах. Я не могу никак понять EndInvoke() дожидается окончания выполнения потока в котором...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru