Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
.NET 4.x

Почему в async void методе не перехватывается исключение?

02.01.2019, 10:21. Показов 4496. Ответов 25

Студворк — интернет-сервис помощи студентам
Привет!

В ряде статей читал о том, что в подобном случае исключение не перехватывается и программа в какой-то момент упадет:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    class Program
    {
        private static async void ThrowExceptionAsync()
        {
            throw new InvalidOperationException();
        }
 
        static void Main(string[] args)
        {
            try
            {
                ThrowExceptionAsync();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
 
            Console.WriteLine("End");
            Console.ReadLine();
        }
    }
Так оно и есть на самом деле. Но я не понимаю почему. Код выполняется в одном и том же потоке. Т.к. в async методе нигде нету await, то ко всему прочему это ещё и синхронно выполняться должно. Нигде, где я об этом читал, не написано доходчиво из-за чего это происходит.

Кто-то может пояснить из-за чего так? Или нужно это просто запомнить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.01.2019, 10:21
Ответы с готовыми решениями:

Почему не перехватывается исключение типа double?
#include <iostream> #include <conio.h> #include <cstring> using namespace std; void obrob(int a) { try { ...

не перехватывается исключение, хоть по книге c++ за 21 день и должно
#include <exception> #include <iostream> #include <string> using namespace std; class CustomException : public std::exception ...

Async await ожидание void
await Task.WaitAll(tasks); Как можно реализовать? Если делать без асинхронности то получается программа ожидает и интерфейс зависает, а...

25
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
13.01.2019, 18:21
Студворк — интернет-сервис помощи студентам
Ещё раз. Как работает Task.Delay(1000).
1. Создаётся задача при помощи TaskCompletionSource.
2. Заводится будильник на 1 секунду, который сделает эту задачу выполненной.
3. Задача возвращается как результат работы метода.

Если между пунктами 2 и 3 поток будет вытеснен на 2 секунды, то Task.Delay(1000) вернёт уже выполненную задачу, а значит кусок кода после await Task.Delay(1000) выполнится синхронно с предыдущим куском кода. Метод Do состоит всего из двух кусков, а значит будет выполнен синхронно полностью. Как следствие, например,
C#
1
2
3
4
5
6
7
8
9
10
public async void Button1_Click(object sender, EventArgs e)
{
    await Run();
}
 
async Task Run()
{
    await Task.Delay(1000).ConfigureAwait(false);
    Thread.Sleep(100_000);
}
Лаг компьютера на 1 секунду в определённый момент повесит пользовательский интерфейс на 101 секунду несмотря на ConfigureAwait(false).
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
14.01.2019, 09:12
Цитата Сообщение от TopLayer Посмотреть сообщение
несмотря на ConfigureAwait(false).
Ну да, переключения контекста не произойдет, тк будет возвращена завершенная задача и результат будет получен сразу.
Однако, может ли такое реально случится что Task.Delay вернет завершенную задачу?
Я так понял работает это на System.Threading.Timer?
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
14.01.2019, 09:59
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Однако, может ли такое реально случится что Task.Delay вернет завершенную задачу?
Ну смотря что под этим словом понимать. Мне кажется, важно лишь то, что такой сценарий возможен.
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Я так понял работает это на System.Threading.Timer?
Да, вроде. Посмотрите исходники.
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
14.01.2019, 10:10
Цитата Сообщение от TopLayer Посмотреть сообщение
Мне кажется, важно лишь то, что такой сценарий возможен.
В теории да, но на практике помещать длительную синхронную операцию
после неблокирующего вызова как то нерационально мягко говоря, может
позже исследую насчет возможнсоти возврата завершенной задачи методом Task.Delay
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
14.01.2019, 10:18
Цитата Сообщение от Woldemar89 Посмотреть сообщение
но на практике помещать длительную синхронную операцию
после неблокирующего вызова как то нерационально мягко говоря
В async методе вообще не должно быть тяжёлых операций. Все тяжёлые операции должны await-иться в обязательном порядке.
0
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
15.01.2019, 10:56  [ТС]
kolorotur, TopLayer, Woldemar89, спасибо за ответы и дискуссию! Большую часть из написанного осознать пока не получается, но на досуге поэкспериментирую с примерами кода и может станет либо понятнее либо появятся уточняющие вопросы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.01.2019, 10:56

Зачем async void требует await?
Привет! У меня есть метод который долго кропотливо кое-что рисует, я его обозначил как async void, но студия предупреждает что без await...

Что такое void в методе?
что в данном случае делает метод void и как он работает? http://priscree.ru/img/397d9fa96dcc5b.jpg

Void menu(void); что это ? почему не void menu();
void menu(void); что это ? почему не void menu(); void naprimer(void); и это идет в классе это вообще правильно так писать ?

Исключение в методе
Есть два варианта кода, первый работает, а второй нет, почему? различие в том, что в первом листинге внутри Method() кидается...

WPF async void fun() для событий контролла. (MapCOntrol.WPF)
Задача: Отмечаем чекбокс элементы и рисуем их на карте. При нажатии на кнопку выполняется событие, где вызывается функция, в которой...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru