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' の例外をスローしました」

ただし、さらに 1 秒後にもう一度カーソルを合わせると、期待どおりの実際の値が得られます。これは、PopulateCollections() コードがまだ各クラスを反映していることを示しています。これは、デバッグせずに実行すると例外がスローされるためです。

「コレクションが変更されました。列挙操作が実行されない可能性があります。」

だから...このメソッドが完了するまでコードを明示的に待機させるにはどうすればよいですか?

4

2 に答える 2

1

私がだましていると思うのは、あなたの_CollectionsPopulatedフラグがコレクションが完全に入力されていることを実際には示していないということです。プロパティを 2 回続けて呼び出すと、Views2 回目はコレクションがまだ作成されているにもかかわらず返されます。

コレクションの状態を追跡する別のフラグを追加することを提案します。コレクションが埋められている途中の場合は、再作成しようとせず、代わりに を返し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

私の解決策は、左側のフィールドから来ました...入力されているクラスが問題でした。ただし、コードはこれを教えてくれませんでしたが、その後、コードは元々問題なく機能していました。

于 2014-06-23T20:30:06.183 に答える