【发布时间】:2017-02-11 18:23:28
【问题描述】:
这就是我想要实现的目标。我启动一项任务并且不等待/结果。为了确保启动的任务进入故障状态(例如抛出异常),我通过在 Continuation 中调用 Environment FailFast 来使进程崩溃。
我面临的问题是,如果我在代码下方运行,在 ContinueWith 内部,任务的状态(引发异常)显示为“RanToCompletion”。我预计它是故障状态。
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");
}
这真的很奇怪 :( 如果我删除 Task.Run 函数调用中的“ConfigureAwait(false)”,任务确实会在 Continue 中进入故障状态。真的无法解释发生了什么,希望能得到一些帮助来自社区。p>
[更新]:我的同事指出了一个明显的错误。当我在 Test.Run 中调用 RunTestAsync 时,我正在使用 ConfigureAwait,即使我没有等待它。在这种情况下,ConfigureAwait 不会将任务返回给 Task.Run。如果我不调用 ConfigureAwait,则确实会返回一个 Task,并且事情会按预期工作。
【问题讨论】:
-
您使用
ContinueWith有什么原因吗?ContinueWith用于预异步等待时代;现在您可以使用await RunTestTaskAsync()后跟Console.WriteLine()并以更标准的方式捕获您想要的任何异常;即try..catch. -
@sellotape:
await现在是处理延续的更惯用的方式是正确的。但是,即使使用await,OP 仍然会遇到同样的问题。他们将等待错误的Task对象,但仍会看到处于非故障状态的任务。 -
@PeterDuniho - 如果他要等待
createdTask,那么可以,但如果他只是等待RunTestTaskAsync()(似乎没有理由不这样做,但我想没有足够的背景可以确定)catch将捕获他抛出的异常。 -
@sellotape: "如果他只是在等待 RunTestTaskAsync()"——但他不是。而他不是他的问题的全部症结所在。我的意思是,只是告诉他使用
await根本不能解决他的问题。如果这里ContinueWith()被await替换,同样的问题仍然会发生。这个问题只是稍微改写了代码。 -
@PeterDuniho - 我并不是说这是一个答案;而只是OP可能会发现有用的相关信息,这就是为什么我发表评论而不是答案(无论如何你的答案涵盖了这个问题)。我还在第一条评论中特别提到了
await RunTestTaskAsync()。
标签: c# asynchronous parallel-processing task configureawait