残りのコードを実行する前に、イベントが発生したことを確認する方法を見つけようとしています。
次のようなイベントをフックします。
public static class ServiceUrlQueryParameters
{
public static void ServiceUrlQueryParameters()
{
...
dynamicMapServiceLayer.Initialized += new EventHandler<EventArgs>(DynamicMapServiceLayerQuery_Initialized);
...
}
}
これで、コードはリスナーをイベントにアタッチし、イベントが発生するまで待機します。しかし、マップ サービス レイヤーの初期化により、コードの次の行に必要な情報が設定されるため、そのイベントが発生するまで、そのクラスで他の処理が行われることは望ましくありません。ただし、アプリケーションの残りのコードと GUI は引き続き実行されます。
以前は、イベント処理リスナー メソッドに残りのコードをこのように配置していました。
private void DynamicMapServiceLayer_Initialized(object sender, System.EventArgs evArgs)
{
Query query = GetParameterQuery();
QueryTask queryTask = new QueryTask(GetRestURL(dynMapServLayer));
queryTask.ExecuteCompleted += GraphicQueryTask_ExecuteCompleted;
...
queryTask.ExecuteAsync(query);
}
しかし、クエリの実行は、サービス層の初期化と意味的に関連していないため、意味がありません。マップ レイヤーの初期化時に実行されるイベント ハンドラー メソッドにクエリ コードを配置することは、私には論理的ではないように思えます。だから、今私はこのように持っています:
public static class ServiceUrlQueryParameters
{
public static void ServiceUrlQueryParameters()
{
// No more Initialized event hookup to any event handling listener
}
public static void QueryUrlParameters()
{
if ( ! dynMapServLayer.IsInitialized)
{
return;
}
Query query = GetParameterQuery();
QueryTask queryTask = new QueryTask(GetRestURL(dynMapServLayer));
queryTask.ExecuteCompleted += GraphicQueryTask_ExecuteCompleted;
queryTask.Failed += QueryTask_Failed;
queryTask.ExecuteAsync(query);
}
}
しかし、QueryUrlParameters が呼び出されたときに、Initialized イベントがまだ発生していない可能性があるため (おそらく発生しない可能性もあります)、これはあまり良い考えではありません。