Форум программистов, компьютерный форум, киберфорум
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. Показов 4369. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru