如何查找未观察到的任务异常的来源

How to find the source of an unobserved task exception

提问人:J4N 提问时间:8/28/2023 最后编辑:Peter CsalaJ4N 更新时间:8/28/2023 访问量:97

问:

在我们的 WPF 应用程序中,我们确实为未观察到的任务异常注册了一个事件处理程序:

TaskScheduler.UnobservedTaskException += OnUnobservedTaskException;

使用以下方法:

private static void OnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs exceptionEventArgs)
{
    _logger.Error(exceptionEventArgs.Exception, Properties.Resources.TaskExceptionsWereNotObserved);
    exceptionEventArgs.SetObserved();
}

我确实得到了完整的堆栈跟踪:

System.AggregateException: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. (The I/O operation has been aborted because of either a thread exit or an application request.)
     ---> System.Net.Sockets.SocketException (995): The I/O operation has been aborted because of either a thread exit or an application request.
       at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Net.Sockets.SocketReceiveFromResult>.GetResult(Int16 token)
       at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
       --- End of inner exception stack trace ---

但是我们的代码中似乎没有任何内容。

我的问题:

有没有办法添加更多调试信息以了解这是在哪里触发的?因为我甚至不确定异常发生在我们的代码中还是在外部库中。

C# 异常 任务 NET-7.0

评论

1赞 Mo B. 8/28/2023
您可以在 的内部异常中找到更多信息。请参阅此处:stackoverflow.com/a/44378474/689923AggregateException
0赞 J4N 8/28/2023
@MoB。嗨,谢谢,但是我已经可以看到innerException是一个,但这并不能帮助我理解这个异常是从哪里触发的?SocketException
0赞 Mo B. 8/28/2023
你怎么能看出内部异常是?堆栈跟踪不显示内部异常。SocketException
0赞 J4N 8/28/2023
@MoB。是的,检查我在问题中提供的堆栈跟踪:。此外,由于它可能是一些编写不正确的代码,我可以放置一个断点并获取异常中的所有信息,但是 的堆栈跟踪在我自己的代码中没有显示任何行。System.Net.Sockets.SocketException (995): The I/O operation has been aborted because of either a thread exit or an application request.SocketException
0赞 Panagiotis Kanavos 8/28/2023
该错误有几个指针。它是一种网络操作,无论是在操作中还是在后台操作中。应用程序没有等待操作(可能是由于),因此当控制器或服务最终被垃圾回收时,网络请求也被取消。没有堆栈,因为在取消操作时,不再有父任务或调用。async void

答: 暂无答案