gpt4 book ai didi

c# - 如何从异常(随机出现的 C# WPF)中获取更多信息?

转载 作者:太空宇宙 更新时间:2023-11-03 21:59:13 29 4
gpt4 key购买 nike

我们有一个运行在 WPF 和 Entity Framework 之上的大型业务应用程序。问题是我们在过去 2 周遇到了一个问题,但无法确定问题的根源。

异常被 DispatcherUnhandledException 捕获,我们从异常中(通过电子邮件)获得的信息是这样的:

mscorlib: Value cannot be null.
at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken)
at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken)
at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
at System.Data.EntityClient.EntityConnection.Dispose(Boolean disposing)
at System.ComponentModel.Component.Finalize()

异常每天“随机”抛出 4 或 5 次,并且仅来 self 们 20 多个用户中的一个。我们无法弄清楚问题!堆栈跟踪没有提供太多信息,我们无法重现该问题。

我假设这是在一个线程上发生的,但我无法确定导致异常的线程,因为我们有很多 BackgroundWorkers 和异步的东西!

那么,我怎样才能获得有关异常的更多信息??


编辑:

没有任何 InnerExceptions。

此外,异常以几分钟和几小时的间隔抛出,例如:11:41、11:46、11:51 然后它运行良好,直到 18:03、18:07、18:11 然后没有抛出异常。这个分钟间隔发生的时刻也是随机的,与服务器或网络上的任何负载无关。

最佳答案

看起来这可能是垃圾收集线程的一部分。堆栈底部的 Finalize 调用是提示,然后可能调用 EntityConnection.Dispose(false);

问题的本质是不确定的。您的环境中可能发生了一些变化,现在正在发生。

在终结器中访问其他托管对象确实不安全。看起来 ChangeConnectionString 可能试图将托管对象用作锁,有时当它在 GC 线程中时,该对象已经被清理。它这样做可能是 EntityConnection 中的错误。

您应该能够通过在您的组件上调用 Dispose 来避免这种情况,而不是让 Finalizer 运行(将它们包含在 using block 中是确保这一点的好方法)。但是,对于您拥有的调用堆栈,很难说出导致问题的组件的性质。

如果您想获得本地重现,请尝试使用覆盖 Finalize 的类(例如 ~MyComponent())对正在访问 EntityConnections 的组件对象进行子类化,并在其中抛出异常。这样,如果 GC 清理了这些对象,您就会崩溃。

关于c# - 如何从异常(随机出现的 C# WPF)中获取更多信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10955985/

29 4 0
文章推荐: 页面底部的 Css 奇怪间距
文章推荐: node.js - 如何手动安装 Node js 包依赖项
文章推荐: css - 在
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com