Windows XP上的TPL

时间:2013-10-18 09:26:23

标签: c# wpf task-parallel-library

我们有一个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。我们不关心结果,只关注“火与忘”策略。

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

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

1 个答案:

答案 0 :(得分:2)

这是.Net 4.0上的预期行为。如果有一个带有异常的Task并且从未观察到该异常,那么在Task完成时会重新抛出异常。

如果您安装了.Net 4.5并且希望获得此行为(例如用于测试),add <ThrowUnobservedTaskExceptions> to 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
  }
});
相关问题