TPL on Windows XP

本文关键字:XP Windows on TPL | 更新日期: 2023-09-27 18:35:50

我们有一个WPF应用程序,其中:

private void SomeHandler(object sender, RoutedEventArgs e)
{
  Task.Factory.StartNew(LoadItems).ContinueWith(t =>
  {
    //cache items to, for instance, db
  }, TaskContinuationOptions.NotOnFaulted);
}
private void LoadItems()
{
//sometimes it throws an exception
//this is expected
throw new FormatException("blablabla");
}

因此,通常,当数据存在时,我们使用此处理程序来尝试缓存数据。如果它不存在,那么我们得到一个格式异常。我们不在乎结果,只关心"一劳永逸"的策略。

最近从客户端获得了两个日志文件,其中我看到 FormatException 被传播到CurrentDomain_UnhandledException处理程序。所有客户端都在带有 .Net 4.0 的 Windows XP 上。

所以问题是为什么会这样?它是否按照设计?

TPL on Windows XP

这是

.Net 4.0 上的预期行为。如果存在具有异常的Task,并且从未观察到该异常,则在Task完成时会重新引发该异常。

如果已安装 .Net 4.5,并且想要获取此行为(例如用于测试),请将<ThrowUnobservedTaskExceptions>添加到 app.config。

如果要确保不会重新引发未观察到的异常Task即使在 .Net 4.0 上,也可以使用 TaskScheduler.UnobservedTaskException

TaskScheduler.UnobservedTaskException += (o, args) => args.SetObserved();

但我认为这里最好的选择是明确遵守例外。您可以通过删除 NotOnFaulted 选项并改为检查 Exception 属性来执行此操作:

Task.Factory.StartNew(LoadItems).ContinueWith(t =>
{
  if (t.Exception == null)
  {
    //cache items to, for instance, db
  }
});