Итак, вот чего я пытаюсь достичь. Я запускаю задачу и не буду ждать/результат. Чтобы убедиться, что если запущенная задача переходит в состояние сбоя (например, скажем, исключение), я разбиваю процесс, вызывая Environment FailFast в продолжении.Задача не переходит в состояние с ошибкой, если для параметра ConfigurAwait установлено значение False
Как проблема, с которой я сталкиваюсь, заключается в том, что если я побежал ниже кода, Inside ContinueWith, статус задачи (которая забросила исключение) появляется как «RanToCompletion». Я ожидал, что это будет Faulted State.
private Task KickOfTaskWorkAsync()
{
var createdTask = Task.Run(() => this.RunTestTaskAsync(CancellationToken.None).ConfigureAwait(false), CancellationToken.None);
createdTask.ContinueWith(
task => Console.WriteLine("Task State In Continue with => {0}", task.Status));
return createdTask;
}
private async Task RunTestTaskAsync(CancellationToken cancellationToken)
{
throw new Exception("CrashingRoutine: Crashing by Design");
}
Это действительно странно :(Если я удалю «ConfigureAwait (ложь)» внутри вызова функции Task.Run, задача действительно переходит в состояние FAULTED внутри Продолжить. Действительно в убыток, чтобы объяснить, что происходит и был бы признателен за помощь со стороны сообщества.
[Обновить]: Мой коллега указал на явную ошибку. Я использую ConfigureAwait, когда я звоню в RunTestAsync внутри Test.Run, хотя я этого не жду. , ConfigureAwait не возвращает задачу в Task.Run.Если я не вызываю ConfigureAwait, задача возвращается, и все работает должным образом.
Есть ли причина, по которой вы используете 'ContinueWith'? 'ContinueWith' был для пред-асинхронной эры; теперь вы можете просто использовать 'await RunTestTaskAsync()', за которым следует 'Console.WriteLine()' и поймать любые исключения, которые вы хотите более стандартным образом; т. е. 'try'..'catch'. – sellotape
@sellotape: правильно, что 'await' - более идиоматический способ справиться с продолжениями сейчас. Однако OP по-прежнему будет иметь такую же проблему, даже используя 'await'. Они будут ожидать неправильный объект «Задача» и все равно будут видеть задачу в состоянии без сбоев. –
@PeterDuniho - если бы он ожидал 'createdTask', то да, но если он просто ждет' RunTestTaskAsync() '(что, по-видимому, мало причин, но я думаю, что недостаточно контекста, чтобы убедиться)' catch' поймает исключение, которое он бросает. – sellotape