4

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

任何人都可以告诉我为什么会发生这种情况吗?

运行时遇到致命错误。错误的地址在0x60f41744, on thread 0x231c。错误代码是0x80131623
此错误可能是 CLR 中的错​​误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。

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

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

奇怪的是,如果我删除这个 ( TaskScheduler.FromCurrentSynchronizationContext()) 选项添加/插入/删除操作,一切似乎都很好。

4

2 回答 2

6

错误代码为 0x80131623

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

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


应用程序通过 System.Environment.FailFast(string message) 请求进程终止。
在 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));
   }
于 2013-01-06T13:52:09.437 回答
-2

内存不好,运行时损坏。

这是一个像这样的致命错误 - 因此它不是 .NET 级别的错误,正如它所说,它指向一些内存损坏,无论出于何种原因。可能是内存损坏、电源损坏或非托管部分中的程序错误导致内存损坏。或运行时出错(JIT 级别,即处理汇编程序级别或 WPF/本机区域的部分),但我不知何故对此表示怀疑。

顺便说一句,在没有错误类型的情况下发布错误描述不太聪明。

于 2013-01-06T11:38:32.380 回答