gpt4 book ai didi

.net - 在 GUI 应用程序中处理 TaskScheduler.UnobservedTaskException 的推荐方法是什么?

转载 作者:行者123 更新时间:2023-12-02 16:18:37 26 4
gpt4 key购买 nike

为了稳健性,我想为 TaskScheduler.UnobservedTaskException 添加一个处理程序。处理程序会记录异常,通知用户并关闭应用程序。

下面的实现有意义吗?在 WPF 中,在此处理程序中显示 MessageBox 或 Windows 是否可以,或者这是一个坏主意,因为我们正在未观察到的任务的终结器中运行?

Private Sub TaskSheduler_UnobservedTaskException(sender As Object, e As UnobservedTaskExceptionEventArgs)
Static _wasUserInformed As Boolean = False

e.SetObserved()

'Trace all Exceptions
e.Exception.Flatten.Handle(Function(ex As Exception)
'TODO trace and log Exception
Debug.Print("UnobservedTaskException: {0}", ex.Message)
Return True
End Function)

If Not _wasUserInformed Then
'Show root Exception
_wasUserInformed = True
Application.Current.Dispatcher.BeginInvoke(Sub()
'MessageBox.Show(e.Exception.GetBaseException.Message)

Dim win As New UnexpectedExceptionWindow
win.UnexpectedException = e.Exception.GetBaseException
win.ShowDialog()

Application.Current.Dispatcher.BeginInvoke(Sub() Application.Current.Shutdown())
End Sub)
End If

结束子

[编辑]经过我们的讨论,我提出了以下解决方案。

Private Sub TaskScheduler_UnobservedTaskException(sender As Object, e As UnobservedTaskExceptionEventArgs
) Handles TaskScheduler.UnobservedTaskException
Static _wasUserInformed As Boolean = False

'Free the finalizer thread and execute on the UI thread to be able to inform user
Dispatcher.BeginInvoke(Sub() LogException(e.Exception))
e.SetObserved()
If Not _wasUserInformed Then
_wasUserInformed = True
'Show first error
Dispatcher.BeginInvoke(Sub()
NotifyUser(e.Exception)
Application.Current.Shutdown()
End Sub)
End If
End Sub

最佳答案

这是一个非常好的问题。由于此事件在终结器线程上运行(我已通过 Reflector 确认了这一点),我们无法承受长时间阻塞。这将阻止终结器的处理。

所以答案是:这不是一个好的设计,因为 UI 操作的持续时间是无限的。

更好的解决方案是将处理排队到新的Task,以便它在线程池上运行。

这个答案取决于实现细节(终结器在单个线程上执行,并且事件在终结器线程上触发)。但至少对于支持 .NET 4.0 的应用程序来说,这个答案是有效的。

关于.net - 在 GUI 应用程序中处理 TaskScheduler.UnobservedTaskException 的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12226268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com