85 / 12 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
||||||||||||||||
1 | ||||||||||||||||
.NET 4.x Почему (за счет чего) исключение внутри Task не рушит приложение?27.02.2019, 16:57. Показов 2223. Ответов 9
Метки нет Все метки)
(
Привет!
Есть метод, который выбрасывает исключение:
Если вызвать этот метод через задачу:
Но Task вроде как использует потоки из пула потоков. Как объекту Task удается перехватить исключение и не ронять приложение?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
1
|
|
27.02.2019, 16:57 | |
Ответы с готовыми решениями:
9
Почему (для чего?) нельзя инициализировать статик переменную внутри класса? Task и исключение |
2715 / 2026 / 374
Регистрация: 22.07.2011
Сообщений: 7,671
|
|
27.02.2019, 19:09 | 2 |
Нормальное поведение - когда второстепенные потоки не роняют главный ,
просто QueueUserWorkItem чуть поумнее и пробрасывает исключение в вызывающий поток , видимо из-за того , что Вы сами поток не создаете и не контролируете его работу.
0
|
906 / 663 / 318
Регистрация: 23.10.2016
Сообщений: 1,538
|
|
27.02.2019, 20:06 | 3 |
0
|
![]() 11046 / 7603 / 1176
Регистрация: 21.01.2016
Сообщений: 28,599
|
|
28.02.2019, 06:57 | 4 |
V0fka, это потому, что
Task как раз и поумнее. Делегат переданный в Task исполняется в своём try\catch , что не даёт "завалить" поток с необработанным исключением и, соответственно, возбудиться на это CLR .Когда в потоке в Task происходит исключение, оно перехватывается и заворачивается в AggregateException, которое сохраняется в свойстве Exception самой задачи, откуда его потом можно прочитать или явно, или через Task.Wait , или через await .Это одна из причин, почему Microsoft настоятельно рекомендует забыть про старые классы Thread и использовать только Task .
2
|
85 / 12 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
||||||
28.02.2019, 10:43 [ТС] | 5 | |||||
Так QueueUserWorkItem как раз и роняет приложение.
Слышал. Но если обернуть
Usaga, я просто думал, что внутри Task используется именно ThreadPool.QueueUserWorkItem, который независимо от try\catch все равно валит приложение. Я думал неправильно?
0
|
![]() 11046 / 7603 / 1176
Регистрация: 21.01.2016
Сообщений: 28,599
|
|
28.02.2019, 10:51 | 6 |
![]() Решение
И не изменится. try\catch только в одном потоке работает, и исполнение кода из этого блока (где ThreadPool) уже вышло.
Да. Не правильно. Что Task, что ThreadPool - оба используют средства ОС. Они друг друга не переиспользуют. Т.е. Task это прямо новая реализация механизмов работы с потоками.
1
|
85 / 12 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|
28.02.2019, 11:15 [ТС] | 7 |
Usaga, ясно, спасибо!
0
|
906 / 663 / 318
Регистрация: 23.10.2016
Сообщений: 1,538
|
||||||
28.02.2019, 22:28 | 8 | |||||
![]() Решение
Там принцип заворачивания другой:
1
|
85 / 12 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|
01.03.2019, 09:41 [ТС] | 9 |
Не подумал, что можно завернуть так
![]() Но сейчас снова стало непонятно: в задачах таки используется ThreadPool.QueueUserWorkItem или там используется что-то другое (что в свою очередь или что около того используется так же внутри ThreadPool.QueueUserWorkItem)?
0
|
![]() 11046 / 7603 / 1176
Регистрация: 21.01.2016
Сообщений: 28,599
|
|
01.03.2019, 10:47 | 10 |
V0fka, я выше написал: в Task полностью своя реализация.
1
|
01.03.2019, 10:47 | |
Помогаю со студенческими работами здесь
10
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |