Re[13]: пару вопросов
От: RushDevion Россия  
Дата: 19.03.20 08:56
Оценка: 8 (1) +1
S>whenall все равно бросит TaskCanceledExp, т.к. все таски находятся в состоянии Canceled. Вопрос, по чему так? Я же в порождающем потоке (_ = Task.Run(...)) уже отловил отмену (я специально морозил поток с whenall и ждал обработки искл. для отмененных потоков) и await whenall все равно бросал TaskCanceledException. Почему, какой в этом смысл, разве отмененные потоки и обработанная отмена этих потоков не делают задачу completed?

S>Упд: Т.е. если мы у отмененной задачи отловили исключение TaskCanceledException, то это стату этой задачи все равно будет Canceled? И поэтому ожидание, в том числе whеnall, у такой задачи всегда бросает (ну это пример теста выше)?


Во-первых, нет такой вещи как "отмененный поток".
Поток — это просто механизм исполнения таски.
Т.е. планировщик выбирает очередную таску и отдает ее какому-то потоку на исполнение.
Если в ходе исполнения возникает exception, он перехватывается и сохраняется в таске.
При этом последняя переходит в Faulted или Cancelled state в зависимости от типа exception'а.
Далее, пусть кто-то в другом потоке говорит таске Wait/await.
Если таска была в Faulted state, она перевыбросит сохраненный Exception (обернутый в AggregateException т.к. в общем случае таска может
представлять более одной операции) на вызывающем потоке.
Если таска была в Cancelled state, на выбросит TaskCancelledException на вызывающем потоке.
Если вызывающих потоков несколько и каждый делает Wait/await — exception будет выкинут для каждого из них.
Поэтому бесполезно пытаться проглотить exception, перехватывая его на одном потоке, а потом делая таске Wait/await на другом.
Re[14]: пару вопросов
От: Sharov Россия  
Дата: 19.03.20 10:14
Оценка:
Здравствуйте, RushDevion, Вы писали:


S>>Упд: Т.е. если мы у отмененной задачи отловили исключение TaskCanceledException, то это стату этой задачи все равно будет Canceled? И поэтому ожидание, в том числе whеnall, у такой задачи всегда бросает (ну это пример теста выше)?


RD>Во-первых, нет такой вещи как "отмененный поток".


Ну оговорился, отмененная задача, вестимо.

RD>Поток — это просто механизм исполнения таски.


Благодарю, хорошая формулировка . А то на собесах любят спросить про отличия, я и растекался мыслью про более высокоуровневую абстракцию.

RD>Если в ходе исполнения возникает exception, он перехватывается и сохраняется в таске.

RD>При этом последняя переходит в Faulted или Cancelled state в зависимости от типа exception'а.
RD>Далее, пусть кто-то в другом потоке говорит таске Wait/await.
RD>Если таска была в Faulted state, она перевыбросит сохраненный Exception (обернутый в AggregateException т.к. в общем случае таска может
RD>представлять более одной операции) на вызывающем потоке.

RD>Если таска была в Cancelled state, на выбросит TaskCancelledException на вызывающем потоке.

RD>Если вызывающих потоков несколько и каждый делает Wait/await — exception будет выкинут для каждого из них.
RD>Поэтому бесполезно пытаться проглотить exception, перехватывая его на одном потоке, а потом делая таске Wait/await на другом.

Вот этого я не знал, я думал что перехватив соотв. исключение, бросившая задача помечается как Completed, ну т.е. больше бросать не будет.
Кодом людям нужно помогать!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.