Если TaskCanceledException — штатная ситуация и нет смысла ее специально как-то обрабатывать. Не хочется ее отлавливать и писать пустой блок catch в нескольких местах.
— то при отмене задачи — все ОК. А вот если задача не была отменена — то уже сам ContinueWith вызывает TaskCanceledException, ибо так тупо сделали — раз ContinueWith не была исполнена — значит задачу пришлось отменить а значит опять таки злополучный TaskCanceledException.
Здравствуйте, Shmj, Вы писали:
S> А вот если задача не была отменена — то уже сам ContinueWith вызывает TaskCanceledException, ибо так тупо сделали — раз ContinueWith не была исполнена — значит задачу пришлось отменить а значит опять таки злополучный TaskCanceledException.
Здравствуйте, Sharov, Вы писали:
S>Это откуда следует?
Запустите код и убедитесь, что он падает с TaskCanceledException https://dotnetfiddle.net/dGQ7c0 (причем, зависит от компиллера — мне нужон .Net Core).
using System;
using System.Threading.Tasks;
public class Program
{
public async static Task Main()
{
var task = Task.Run(() => { Console.WriteLine(1); })
.ContinueWith(t => { }, TaskContinuationOptions.OnlyOnCanceled);
await task;
}
}
Возможно даже это баг компиллера, т.к. Roslyn и .Net-классик — работают иначе.
Здравствуйте, Shmj, Вы писали:
S>Возможно даже это баг компиллера, т.к. Roslyn и .Net-классик — работают иначе.
М-да, с одной стороны логично, мы ожидаем задачу, которая была отменена. С другой стороны ее реальный статус WaitingForActivation, т.е. она даже не запускалась...
Интересный момент...
Здравствуйте, Sharov, Вы писали:
S>М-да, с одной стороны логично, мы ожидаем задачу, которая была отменена. С другой стороны ее реальный статус WaitingForActivation, т.е. она даже не запускалась... S>Интересный момент...
Но что же делать? Решение то нужно уже сегодня написать...
Здравствуйте, Shmj, Вы писали:
S>>М-да, с одной стороны логично, мы ожидаем задачу, которая была отменена. С другой стороны ее реальный статус WaitingForActivation, т.е. она даже не запускалась... S>>Интересный момент...
S>Но что же делать? Решение то нужно уже сегодня написать...
Ловить исключение, вестимо. Хотя вообще делать await на отмененной задаче какой смысл? Это нужно, чтобы выполнить какой-нибудь вспомогательный код или что-то залогировать, смысл
ждать continuation
Здравствуйте, Shmj, Вы писали:
S>Если TaskCanceledException — штатная ситуация и нет смысла ее специально как-то обрабатывать. Не хочется ее отлавливать и писать пустой блок catch в нескольких местах.
Здравствуйте, Sharov, Вы писали:
S>Ловить исключение, вестимо. Хотя вообще делать await на отмененной задаче какой смысл? Это нужно, чтобы выполнить какой-нибудь вспомогательный код или что-то залогировать, смысл S>ждать continuation
Вот в том то и дело — не хочется писать путстые блоки try|catch(TaskCanceledException). Лучше просто игнорить.
Можно типа:
using System;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
{
var task1 = Task.Run(() => { throw new TaskCanceledException(); })
.ContinueWith(t =>
{
if (t.IsFaulted)
throw t.Exception;
});
var task2 = Task.Run(() => { throw new Exception("test"); })
.ContinueWith(t =>
{
if (t.IsFaulted)
throw t.Exception;
});
await task1; // Ничего
await task2; // Exception
}
}
Т.е. цель — игнорить отмененные (TaskCanceledException), но не терять все остальное.
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Sharov, Вы писали:
S>>Ловить исключение, вестимо. Хотя вообще делать await на отмененной задаче какой смысл? Это нужно, чтобы выполнить какой-нибудь вспомогательный код или что-то залогировать, смысл S>>ждать continuation
S>Вот в том то и дело — не хочется писать путстые блоки try|catch(TaskCanceledException). Лучше просто игнорить.
S>Можно типа:
S>
S>using System;
S>using System.Threading.Tasks;
S>public class Program
S>{
S> public static async Task Main()
S> {
S> var task1 = Task.Run(() => { throw new TaskCanceledException(); })
S> .ContinueWith(t =>
S> {
S> if (t.IsFaulted)
S> throw t.Exception;
S> });
S> var task2 = Task.Run(() => { throw new Exception("test"); })
S> .ContinueWith(t =>
S> {
S> if (t.IsFaulted)
S> throw t.Exception;
else if (t.IsCanceled)
throw new TaskCanceledException();
S> });
S> await task1; // Ничего
S> await task2; // Exception
S> }
S>}
S>
S>Т.е. цель — игнорить отмененные (TaskCanceledException), но не терять все остальное.
S>Вот и думаю как красивее сделать.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Shmj, Вы писали:
S>Возможно даже это баг компиллера, т.к. Roslyn и .Net-классик — работают иначе.
Как иначе?
Запустил — везде появляется Task Canceled Exception.