Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052

Async await на событии в WinForms

22.08.2023, 17:05. Показов 835. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        private /* async */ void MainForm_Load(object sender, EventArgs e)
        {
            ServiceManager.API.ConnectionId = IDConnTextBox.Texts = Properties.Settings.Default.idConn;
 
            // TokenTextBox.Texts = Properties.Settings.Default.token = await ServiceManager.API.GetTokenAsync(); // по идее же на этой строке основной поток должен дождаться?!
            // Properties.Settings.Default.Save();
            
            // Выставить сертификат
            try
            {
                X509Store store = new X509Store(Properties.Settings.Default.csp, StoreLocation.CurrentUser); // подгружаем выбранный сертификат при прошлом запуске (значение хранится в csp)
                store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
                X509Certificate2Collection collection = store.Certificates as X509Certificate2Collection;
                Program.cert = collection.Find(X509FindType.FindBySerialNumber, Properties.Settings.Default.CertSerialKey, true)[0];
                CertLabel.Text = Program.cert.Subject;
            }
            catch
            {
                MessageBox.Show("Сертификат не выбран!");
            }
        }
await ServiceManager.API.GetTokenAsync() - await только ради HttpClient, которые вызывается на более низком уровне вызовов.
Описание проблемы. Если я ставлю получение токена на кнопку:
C#
1
2
3
4
public async void GetTokenBtn_Click(object sender, EventArgs e)
{
    TokenTextBox.Texts = Properties.Setting.Default.Token = await ServiceManager.API.GetTokenAsync();
}
то при открытии первичной формы Main подгружается выбранный сертификат на прошлом запуске приложения.
Но если перемещаю локигу из кнопки в Load событие формы, то форма начинается себя странно вести. Открывается окно с выбором сертификатов, когда за это отвечает совсем другая кнопка, и лишь только после выбора появляется текст на контро'ле TokenTextBox. Как будто приложении совсем пофиг то что я задаю сертификат из конфига.
А если в Load убрать async и прописать:
C#
1
TokenTextBox.Texts = Properties.Settings.Default.token =  ServiceManager.API.GetTokenAsync().GetAwaiter().GetResult();
тогда UI блокируется навсегда при вызове await httpClient.GetAsync(url) на низком уровне (т.е. это самый крайний await с конца вложенности вызовов методов в GetTokenAsync).
Я не понимаю почему, не подгружается прошлый сертификат, и почему не происходит ожидание асинхронного метода. Как бороться?

Сегодня пол дня просидел над фиксом подобного бага, с другим методом, когда приложение тупо зависало и не один Exception не вылетает даже, даже в лог ничего не пишется, что httpClient что-то отправил и Timeout в 30 секунд у него не срабатывал. А всего лишь надо было GetAwaiter().GetResult() убрать, сделать метод на кнопке async void и прописать await на вызове асинхронног метода - и всё заработало как надо.
Не знаю зачем челу захотелось при клике на кнопку менять курсор на Wait курсор, вызывать таким методом асинхронный код в синхронном методе, а потом устанавливать нормальный курсор.
C#
1
2
3
4
5
6
7
        private void Button_Click(object sender, EventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            Label.Text = ReportHandler.SendReport(_codeTable, _fileName, circulationProp, NoteLabel.Texts).GetAwaiter().GetResult(); // зависает прога и ничего не происходит. Тоже на низком уровне вызов httpClient
            // это так называемый deadlock????
            this.Cursor = Cursors.Default;
        }
А потом понял, что token в конфиг не сохраняется, полез пытаться править, и вышел такой глюк с сертификатом. Подозреваю что как-то не правильно использую await в Windows Forms.

Добавлено через 37 минут
Крч, как вызвать async метод в синхронном, чтоб async вел себя как синхронный? А то httpClient.GetAsync с await работает.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2023, 17:05
Ответы с готовыми решениями:

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

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

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.08.2023, 17:05
Помогаю со студенческими работами здесь

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

async/await
https://metanit.com/sharp/tutorial/13.7.php вот код Task<T>: // определение асинхронного метода static async...

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

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

Async await + zeromq
Добрый день, уважаемые гуру. Помогите разобраться с проблемой уже несколько недель бьюсь. Имеется клиент-сервер на zeromq Клиент: ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru