C# 防止Task.ContinueWith出现异常
如果第一部分失败,我试图阻止任务继续 我的代码如下所示:C# 防止Task.ContinueWith出现异常,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,如果第一部分失败,我试图阻止任务继续 我的代码如下所示: Task listener = Task.Factory.StartNew(openConnection).ContinueWith((t) => listenForNumber()); void openConnection() { try { //stuff } catch { //more
Task listener = Task.Factory.StartNew(openConnection).ContinueWith((t) => listenForNumber());
void openConnection()
{
try
{
//stuff
}
catch
{
//morestuff
}
}
void listenForNumber()
{
//even more stuff
}
现在,如果openConnection()进入catch块,则不应执行listenForNuber()
我尝试了ContinueWith((t)=>listenForNumber(),TaskContinuationOptions.notonfault)代码>
但没有成功,有什么帮助吗(
感谢TaskContiuationOptions。除非您的方法出现故障,即在执行过程中引发的异常未经处理,否则“无故障”
显然无效
在catch块中,您应该在完成工作(可能需要进行一些清理)后,使用throw;
语句重新抛出异常(并保留堆栈跟踪)-否则将不会再次引发异常,因此您的方法将不会被视为“有故障”。您需要在任务方法中引发异常。TPL不知道该方法已失败,除非它捕获到异常
对于出现故障的情况,您仍然需要一个continuation方法。这可能是一个记录异常的简单方法
如果没有异常的延续方法,则当任务方法引发异常时,应用程序中会出现未处理的异常。创建扩展方法帮助器
public static void PropagateExceptions(this Task task)
{
if (task == null)
throw new ArgumentNullException("task");
if (!task.IsCompleted)
throw new InvalidOperationException("The task has not completed yet.");
if (task.IsFaulted)
task.Wait();
}
然后在执行任何代码之前调用PropagateExceptions()扩展方法。如果任务被取消,PropagateExceptions()方法也将重试
t1.ContinueWith(t => {
t.PropagateExceptions();
listenForNumber();
});
您是在catch块中重新抛出还是吞下异常?好的,但是如果我重新抛出异常,那么吞下异常的最佳位置是哪里(以及如何)因此,我不会得到未经用户代码处理的AggregateExection或异常?我不需要再次处理它,因为在第一个catch块中已经完成了所有操作。@Ekoms:据我所知,只有在访问任务的Result
属性时才会抛出AggregateException。这应该是可以吞下exception的地方但是首先你应该检查它是否真的是你想要吞下的异常,而不仅仅是一些意外的异常。