当我尝试向集合(或任何更改集合的操作)添加/插入/删除时,我得到以下异常。 初始化集合,插入的项目不为null,与集合T的类型相同。
任何人都可以告诉我为什么会这样吗?
运行时遇到了致命错误。错误的地址位于线程0x60f41744
上的0x231c
。错误代码为0x80131623
此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。
更新:
该集合是ObservableCollection
,我设法知道它发生在集合的通知部分发生了变化。
这发生在具有TaskScheduler.FromCurrentSynchronizationContext()
选项的任务内的UI线程上。
奇怪的是,如果我删除此(TaskScheduler.FromCurrentSynchronizationContext()
)选项添加/插入/删除操作,似乎一切正常。
答案 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 /本机区域的部分),但我有点怀疑。
顺便说一句,如果没有 - 啊 - 错误的类型,发布错误描述并不太聪明。