gpt4 book ai didi

c#:堆栈在调用时停止

转载 作者:可可西里 更新时间:2023-11-01 02:36:06 26 4
gpt4 key购买 nike

在 C#/.net 中,当发生错误时,堆栈会记录在 Windows 错误日志中。但是,我的应用程序有很多跨线程调用。堆栈跟踪似乎在每次调用 (MarshalledInvoke) 时都停止。

例如:

我的堆栈:

Exception Info: Facebook.FacebookApiException
Stack:
at System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)
at System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[])
at Test.TcpTest.InterpretData()
at Test.TcpTest.Incoming(System.String)
at Test.TcpTest.cLoop()
at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ThreadHelper.ThreadStart()

异常发生在堆栈中进一步执行的代码中。但是,堆栈每次都在 marshalledInvoke 处停止。

我可以做些什么来在调用时继续堆栈?

最佳答案

当您使用 Control.Invoke() 而不是 Control.BeginInvoke() 时,在 UI 线程上引发的任何异常都会被编码回您的工作线程并重新抛出。有一些信息丢失,你得到最里面的异常。

使用 Invoke() 很少是正确的,并且通常有害,因为它可能导致死锁、混淆异常并延迟您的工作线程。在 UI 线程执行委托(delegate)目标之前,它会被阻塞。这可能需要一段时间。请确保您确实需要它。仅当您调用需要其返回值的方法时,这才是真正必要的。应始终避免这种情况。

您可以使用 Debug + Exceptions 调试这些异常,勾选 CLR Exceptions 的 Thrown 复选框。调试器现在将在抛出异常的代码处停止。

关于c#:堆栈在调用时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21832073/

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