0

我有一个公共属性公开了一个类管理器(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();
    }
}

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

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

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

当通过每个可用模型(每个都有自己的 ClassesTables 组)进行解析时,我到了我正在查看视图的这一点......

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

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

“‘ThisModel.Views’引发了‘System.InvalidOperationException’类型的异常”

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

“集合已修改;枚举操作可能无法执行。”

那么......我如何让代码明确等待,直到这个方法完成?

4

2 回答 2

1

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

我建议添加另一个标志来跟踪集合的状态。如果集合正在填充中,请不要尝试重新填充它,而是 return 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;
}
于 2013-09-19T01:24:58.893 回答
0

我的解决方案来自左侧字段...正在填充的 CLASS 是问题所在。然而,代码并没有告诉我这一点,之后,代码就像它最初的工作一样顺利。

于 2014-06-23T20:30:06.183 回答