どのユーザーがどのビューを使用できるかを管理するクラス マネージャー (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() コードがまだ各クラスを反映していることを示しています。これは、デバッグせずに実行すると例外がスローされるためです。
「コレクションが変更されました。列挙操作が実行されない可能性があります。」
だから...このメソッドが完了するまでコードを明示的に待機させるにはどうすればよいですか?