这意味着什么以及如何解决它?
我正在使用TPL任务。
整个错误
通过等待任务或访问其异常属性,未观察到任务的异常。因此,未观察到的异常被终结器线程重新抛出。
在System.Threading.Tasks.TaskExceptionHolder.Finalize()
mscorlib
发布于 2011-10-25 07:21:02
如果您创建了一个任务,并且您从未调用过task.Wait()
或尝试检索Task<T>
的结果,那么当垃圾收集器收集该任务时,它将在完成期间销毁您的应用程序。有关详细信息,请参阅Exception Handling in the TPL上的MSDN页面。
这里最好的选择是“处理”异常。这可以通过延续来完成--你可以给任务附加一个延续,并记录/吞咽/等等发生的异常。这提供了一种清晰的方法来记录任务异常,并且可以编写为一个简单的扩展方法,即:
public static void LogExceptions(this Task task)
{
task.ContinueWith( t =>
{
var aggException = t.Exception.Flatten();
foreach(var exception in aggException.InnerExceptions)
LogException(exception);
},
TaskContinuationOptions.OnlyOnFaulted);
}
有了上面的功能,你就可以通过以下方式防止任何任务破坏应用程序并记录它:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
或者,您可以订阅TaskScheduler.UnobservedTaskException并在那里处理它。
发布于 2011-10-25 07:21:33
当然;这意味着Task
在被遗留给垃圾收集之后被完成了,但是任务本身失败了。有两种修复方法:
ContinueWith(...)
订阅,在parameter).Exception
事件中检查Task
上的.IsFaulted
和.Exception
,并将其标记为观察到(记录错误后调用e.SetObserved()
)https://stackoverflow.com/questions/7883052
复制相似问题