属性函数引发异常

本文关键字:异常 函数 属性 | 更新日期: 2023-09-27 18:31:56

我有一个公共属性,它公开了一个类管理器(ViewManager),它管理哪些视图可供哪些用户使用。 此属性(和其他几个属性)调用名为 PopulateCollections() 的函数,然后返回私有字段_Views。

private bool _CollectionsPopulated = false;
public ViewManager Views { get { PopulateCollections(); return _Views;}}
void PopulateCollections()
{
    if (_CollectionsPopulated) return;
    _CollectionsPopulated = true;
    foreach (ClassTable item in ClassessTables)
    {
        item.ReflectMe();
    }
}

表是另一个类,它将类的结构存储在数据库表中。函数 ReflectMe() 调用每个类项来获取每个类的属性。

所有这些代码都很好用。我的问题是时机问题。

当代码运行时,99% 的时间我没有问题。 但是对于这 1%,函数 PopulateCollections() 花费的时间太长,它会导致异常。

在解析每个可用的模型(每个模型都有自己的类表组)时,我到了查看视图的地步......

If  ((ThisModel != null) && (ThisModel.Views != null))
{
    //Code here
}

当它到达第一次触发 PopulateCollections 的"ThisModel.Views"时,当我将鼠标悬停在 ThisModel.Views 上时,我得到以下结果:

"'ThisModel.Views' 抛出了一个类型为'System.InvalidOperationException'的异常"

但是,再

过一秒钟,当我再次将鼠标悬停在它上面时,我得到了我期望的实际值。 这告诉我 PopulateCollections() 代码仍然反映每个类,因为当我在没有调试的情况下运行它时,引发的异常是

"收藏被修改;枚举操作可能无法执行。

所以。。。如何使代码显式等待此方法完成?

属性函数引发异常

我认为具有欺骗性的是,您的_CollectionsPopulated标志并没有真正表明该集合已完全填充。当您快速连续调用 Views 属性两次时,即使集合仍在创建中,第二次也会返回。

我建议添加另一个跟踪集合状态的标志。 如果集合正在填充中,请不要尝试重新填充它,而是返回null

private bool _collectionsPopulating = false;
private bool _CollectionsPopulated = false;
public ViewManager Views 
{ 
     get 
     { 
         if (_collectionsPopulating) return null;
         PopulateCollections(); 
         return _collectionsPopulat_Views;
     }
}
void PopulateCollections()
{
    if (_CollectionsPopulated) return;
    _collectionsPopulating = true;
    foreach (ClassTable item in ClassessTables)
    {
        item.ReflectMe();
    }
    _CollectionsPopulated = true;
    _collectionsPopulating = false;
}

我的解决方案来自左边的字段...正在填充的类是问题所在。 然而,代码并没有告诉我这一点,之后,代码最初可以顺利运行。