如果第一部分失败,我试图阻止任务继续。
我的代码看起来像这样:
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.NotOnFaulted);
但没有成功,有什么帮助吗? :(
由于
答案 0 :(得分:8)
TaskContiuationOptions.NotOnFaulted
显然无效,即在执行期间抛出的异常未处理。
在catch块中,您应该在执行完工作后使用throw;
语句重新抛出异常(并保留堆栈跟踪)(可能会进行一些清理) - 否则异常会赢得'再次抛出,所以你的方法不会被视为“有问题”。
答案 1 :(得分:2)
创建扩展方法助手。
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();
});
答案 2 :(得分:1)
您需要在任务方法中抛出异常。 TPL不知道方法失败,除非它捕获异常。
您仍需要为故障案例提供延续方法。这可能是记录异常的简单方法。
如果您没有异常的延续方法,当您的任务方法抛出异常时,您的应用程序中将会出现未处理的异常。