【发布时间】:2012-01-11 19:17:25
【问题描述】:
我们的代码会产生以下未处理的异常:
错误消息:System.Reflection.TargetParameterCountException: 参数计数不匹配。
在 System.Reflection.RuntimeMethodInfo.Invoke(对象 obj,BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化、 布尔型 skipVisibilityChecks)
在 System.Delegate.DynamicInvokeImpl(Object[] args)
在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托 回调,对象参数,Int32 numArgs)
在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象 源,委托方法,对象参数,Int32 numArgs,委托 捕获处理程序)。堆栈跟踪: System.Reflection.TargetParameterCountException:参数计数 不匹配。
在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr,Binder binder,Object[]参数, CultureInfo 文化,布尔型 skipVisibilityChecks)
在 System.Delegate.DynamicInvokeImpl(Object[] args)
在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托 回调,对象参数,Int32 numArgs)
在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(对象 源,委托方法,对象参数,Int32 numArgs,委托 catchHandler)。
我们知道这种情况何时发生。我们正在向 UI 绑定的 ObservableCollection 添加一个项目。但是,鉴于错误很少发生,我们无法解释为什么会发生这种情况,或者如何解决它。由于它是一个零星的问题,它不太可能是绑定或 DataTemplates 中的某种错字,因为这些错误“每次”都会出错。在我们的代码中,我们没有使用反射或任何预期在运行时调用参数的东西;异常必须引用 Microsoft 的一些内部类。此外,堆栈跟踪仅包含 Microsoft 代码;我们一直无法在堆栈跟踪本身(即 System.Windows.Threading.ExceptionWrapper)中找到许多类的任何文档。我们如何调试这种错误?有没有办法在这些内部 Microsoft 类中放置某种断点,以便我们可以看到哪些类型的输入触发了这种行为?
【问题讨论】:
-
要检查的一件事:您确定只访问 UI 线程上的 ObservableCollection 吗?即使您锁定了对集合的访问,ObservableCollection 通知也不是线程安全的。
-
在这种情况下我们不会得到一个相当具体的非法跨线程异常吗?
-
@GWLIosa,如果您启用了特定的托管调试助手,则可能。即使那样,我也不确定 ObservableCollection 的绑定系统是否被该助手覆盖(它最初是为 WinForms 构建的,用于检测来自非 UI 线程的 Control 属性访问。)我刚刚提到它,因为它可能很容易检查和每当我遇到间歇性故障时,我的第一个怀疑就是线程竞争条件。
-
请将代码发布在您怀疑它正在死去的地方。你没有回答丹·布莱恩特的问题。您是否在拥有 UI 的线程以外的线程上更新 ObservableCollection?根据经验,您将收到中间错误,并且可能没有有意义的错误消息。由一个线程来询问它是否拥有 UI。如果它不询问并且有时会尝试后台线程成功更新 UI。如果您在拥有 UI 的线程以外的线程上更新任何 UI 源,请尝试使用 BackgroundWorker
标签: .net wpf error-handling