在我的WPF C#应用中,我偶尔会收到错误:"类型异常' System.ExecutionEngineException'被扔了#34;该错误似乎发生在OnPropertyChanged事件的中间。
来自例外的信息: InnerException为null。 数据是{System.Collections.EmptyReadOnlyDictionaryInternal}
我正在使用.Net 4.5.1。
任何人都有任何想法会导致什么?
protected void OnPropertyChanged(string propName)
{
VerifyProperty(propName);
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
try
{
handler(this, new PropertyChangedEventArgs(propName));
}
catch (Exception)
{
}
}
}
在PropertyChangedEventArgs调用期间似乎抛出了异常。
这是验证属性。
[Conditional("DEBUG")]
private void VerifyProperty(string property)
{
Type t = this.GetType();
System.Reflection.PropertyInfo info = t.GetProperty(property);
if (info == null)
throw new ArgumentException(string.Format("Property \"{0}\" does not exist in type {1}!", property, t.Name));
}
答案 0 :(得分:0)
我发现了一些垃圾收集可能出现问题的引用,导致System.ExecutionEngineException。我还发现了几个引起异常的.Net错误的引用。
在我们的代码中,发生异常时正在更新的对象正在同时进行修改。修改是单个对象引用: project.ExtendedData = status.ProjectStatus; ExtendedData是发生异常时正在更新的属性。
我修改了代码以在修改对象时禁用更新。这解决了这个问题。在修复之前,我能够在80%的时间内重现错误。
我不确定如何引用垃圾收集的对象。我认为在没有对象的引用之前,对象不应该被垃圾收集。 CLR垃圾如何收集仍在使用的对象?