我有一个成功的以及有故障的延续的任务代码。
Task<IEnumerable<IDictionaryObject>> getParameters = _parametersRequester.BeginGetParametersBulk(requestJob);
var processParameters =
getParameters.ContinueWith((x) =>
{
//Do some processing
}, TaskContinuationOptions.OnlyOnRanToCompletion);
getParameters.ContinueWith((x) =>
{
AggregateException ex = x.Exception;
ex.Flatten().Handle(ie => HandleException(requestJob, canRetry, ie));
}, TaskContinuationOptions.OnlyOnFaulted);
return processParameters;
如果发生异常,则HandleException重试某些操作,如果遇到未知异常则返回false。 我看到的问题是 getParameters 抛出OutOfMemoryException,它应该在GC终结器运行时终止进程,但它们似乎没有运行,因此进程仍然在运行且处于不稳定状态。
如果HandleException返回false,有没有办法强制进程终止?
答案 0 :(得分:4)
Handle
未处理的例外情况会重新打包到新的AggregateException
并重新投放。
在.NET 4.5中,默认行为是未观察到的任务异常不会取消该过程。
要更改此设置(并恢复.NET 4.0行为),请将以下内容添加到您的应用配置中:
<configuration>
<runtime>
<ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>
</configuration>
有关详细信息,请参阅here。
您最好观察异常,如果不能正常关闭,至少应用您的应用程序日志记录报告异常或类似:
System.Environment.Failfast("Meaningful error message.", exception);