当我尝试添加/插入/删除一个集合(或任何改变集合的操作)时,我得到以下异常。初始化集合,插入的项不为空,且与集合t的类型相同。
有谁能告诉我为什么会这样吗?运行时遇到致命错误。错误的地址在0x60f41744
,在线程0x231c
上。错误码为0x80131623
。
此错误可能是CLR中的错误,也可能是用户代码中不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会损坏堆栈。
更新:该集合是一个ObservableCollection
,并且我设法了解它发生在集合更改的通知部分。
这发生在带有TaskScheduler.FromCurrentSynchronizationContext()
选项的任务中的UI线程上。
奇怪的是,如果我删除这个(TaskScheduler.FromCurrentSynchronizationContext()
)选项的添加/插入/删除操作,一切似乎工作良好。
错误码0x80131623
这是一个非常具体的错误代码,core_failfast。只有一种方法可以生成它,有人称之为Environment.FailFast()。
很明显,挑战在于找出是什么代码调用的。首先查看Windows应用程序事件日志,应该有一条关于它的消息,给出了调用的主要原因,无论传递给FailFast()的字符串是什么。
应用程序通过System.Environment请求进程终止。FailFast(字符串消息)。
在System.Environment.FailFast system . string) (
System.Windows.WeakEventManager.DeliverEventToList(系统。对象,系统。EventArgs ListenerList)
System.Windows.WeakEventManager.DeliverEvent(系统。对象,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));
}
内存不好,运行时出错
这是一个致命的错误,因此它不是一个。net级别的错误,它指出了一些内存损坏的原因,无论什么原因,正如它所说。可能是坏的内存,坏的电源,或程序错误在非托管部分损坏内存。或者运行时错误(JIT级别,即处理汇编级别的部分,或WPF/本机区域),但我不知何故怀疑。
顺便说一句。