收集奇怪的例外

时间:2013-01-06 11:33:50

标签: wpf exception observablecollection

当我尝试向集合(或任何更改集合的操作)添加/插入/删除时,我得到以下异常。 初始化集合,插入的项目不为null,与集合T的类型相同。

任何人都可以告诉我为什么会这样吗?

运行时遇到了致命错误。错误的地址位于线程0x60f41744上的0x231c。错误代码为0x80131623 此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。

更新: 该集合是ObservableCollection,我设法知道它发生在集合的通知部分发生了变化。

这发生在具有TaskScheduler.FromCurrentSynchronizationContext()选项的任务内的UI线程上。

奇怪的是,如果我删除此(TaskScheduler.FromCurrentSynchronizationContext())选项添加/插入/删除操作,似乎一切正常。

2 个答案:

答案 0 :(得分:5)

  

错误代码为0x80131623

这是一个非常具体的错误代码,COR_E_FAILFAST。只有一种方法可以生成它,有人称之为Environment.FailFast()。

显然,挑战在于找出所谓的代码。首先看一下Windows应用程序事件日志,应该有一条关于它的消息,它给出了调用的主要原因,无论字符串是否传递给FailFast()。


  

应用程序通过System.Environment.FailFast(字符串消息)请求进程终止   在System.Environment.FailFast(System.String)
  在System.Windows.WeakEventManager.DeliverEventToList(System.Object,System.EventArgs,ListenerList)
  在System.Windows.WeakEventManager.DeliverEvent(System.Object,System.EventArgs)

是的,该代码中有一个Assert()。我只是发布我在参考源中看到的内容,我对你的代码知之甚少,看看你做错了什么。除了线程之外肯定是触发此类问题的好方法,ObservableCollection完全是线程不安全的,必须受锁保护。

   // if the event isn't handled, something is seriously wrong.  This
   // means a listener registered to receive the event, but refused to
   // handle it when it was delivered.  Such a listener is coded incorrectly.
   if (!handled)
   {
       Invariant.Assert(handled,
                   SR.Get(SRID.ListenerDidNotHandleEvent),
                   SR.Get(SRID.ListenerDidNotHandleEventDetail, iwel.GetType(), managerType));
   }

答案 1 :(得分:-2)

内存不良,运行时损坏。

这是一个致命的错误 - 因此它不是.NET级别的错误,它指出了某些内存损坏,无论出于何种原因,正如它所说的那样。可能是内存不良,电源供应不良或者内存损坏的非托管部分出现程序错误。或运行时中的错误(JIT级别,即处理汇编程序级别或WPF /本机区域的部分),但我有点怀疑。

顺便说一句,如果没有 - 啊 - 错误的类型,发布错误描述并不太聪明。