错误:评估函数“function”超时,需要以不安全的方式中止

完整消息文本:评估函数 '函数' 超时,需要以不安全的方式中止。 此问题可能会导致目标进程的损坏。

为了更轻松地检查 .NET 对象的状态,调试器会自动强制调试的进程运行其他代码(通常是属性 getter 方法和 ToString 函数)。 在所有方案中,这些函数都快速完成,并简化调试。 但是,调试器不会在沙盒中运行应用程序。 因此,调用停止响应的本机函数的属性 getter 或 ToString 方法可能会导致可能无法恢复的长时间超时。 如果您遇到此错误消息,则表示已经发生此问题。

此问题的一个常见原因是,当调试器评估属性时,它只允许正在检查的线程执行。 因此,如果属性正在等待其他线程在调试的应用程序内运行,并且如果以 .NET 运行时无法中断的方式等待,则会发生此问题。

更正此错误

有关此问题的几种可能的解决方案,请参阅以下部分。

解决方案 #1:阻止调试器调用 getter 属性或 ToString 方法

错误消息告知调试器尝试调用的函数的名称。 如果可以修改此函数,则可以阻止调试器调用属性 getter 或 ToString 方法。 请尝试以下选项之一:

  • 将方法更改为除属性 getter 或 ToString 方法之外的某些其他类型的代码,问题将消失。

    -或-

  • (对于 ToString)在类型上定义 DebuggerDisplay 属性,并且你可以让调试器评估 ToString 以外的其他内容。

    -或-

  • 对于属性 getter,请在属性上应用 System.Diagnostics.DebuggerBrowsable(DebuggerBrowsableState.Never) 特性。 如果你有一个方法因为 API 兼容性原因需要保留为属性,但实际上它应该是一个方法,这可能会很有用。

解决方案 #2:让目标代码要求调试器中止评估

错误消息告知调试器尝试调用的函数的名称。 如果属性 getter 或 ToString 方法有时无法正确运行,尤其是在代码需要另一个线程来运行代码的情况下,则实现函数可以调用 System.Diagnostics.Debugger.NotifyOfCrossThreadDependency 来要求调试器中止函数评估。 使用此解决方案,仍可以显式评估这些函数,但默认行为是,执行会在 NotifyOfCrossThreadDependency 调用发生时停止。

解决方案 #3:禁用所有隐式计算

如果前面的解决方案未解决问题,则可以禁用 “启用属性评估”和其他隐式函数调用 选项。 此配置会禁用大多数隐式函数评估,并应解决此问题。

“工具>选项”窗格中,展开“所有设置>>”部分,并清除“启用属性评估”和其他隐式函数调用复选框。

“工具>选项 ”对话框中,展开 “调试>常规 ”部分,并清除 “启用属性评估”和其他隐式函数调用 复选框。

解决方案 #4:检查与第三方开发人员工具的兼容性

如果使用 Resharper,请参阅 此问题 以获取建议。