0

残りのコードを実行する前に、イベントが発生したことを確認する方法を見つけようとしています。

次のようなイベントをフックします。

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 イベントがまだ発生していない可能性があるため (おそらく発生しない可能性もあります)、これはあまり良い考えではありません。

4

2 に答える 2

0

主な問題は、クエリの実行がサービス層の初期化と意味的に関連していないため、層の初期化イベントのリスナー メソッドにクエリを配置しても意味がないことでした。マップ レイヤーの初期化時に実行されるイベント ハンドラー メソッドにクエリ コードを配置することは、論理的ではありません。

.NET 4.5 Task Parallel ライブラリの詳細な調査はまだ開始していないため、これを行うことにしました。

イベントハンドリングリスナーメソッドでは、このようにクエリメソッドを呼び出しました。

private void DynamicMapServiceLayer_Initialized(object sender, System.EventArgs evArgs) 
{ 
   QueryUrlParameters();
} 

そして、その責任に一致する名前を持つメソッドで、パラメーターのクエリ手順を保持します。

public static void QueryUrlParameters()
{
   Query query = GetParameterQuery();
   QueryTask queryTask = new QueryTask(GetRestURL(dynMapServLayer));
   queryTask.ExecuteCompleted += GraphicQueryTask_ExecuteCompleted;
   queryTask.Failed += QueryTask_Failed;
   queryTask.ExecuteAsync(query);   
}

これはまだそれほど優れた解決策ではありません。
イベントが初期化されるのを待つより洗練された方法をお勧めします。しかし、これが今のところ私が持っているすべてのようです。

于 2013-05-22T13:51:14.360 に答える
0

async/await は、特定の問題を解決するように設計されています。

WCF 呼び出しをタスクに変換する必要があります。それからそれは問題です

public static async void QueryUrlParameters()
{
    await dynMapServLayer.EnsureIsInitialized();

    Query query = GetParameterQuery();
    QueryTask queryTask = new QueryTask(GetRestURL(dynMapServLayer));

    var result = await queryTask.ExecuteAsync(query);   

    // etc ....
}

アップデート:

On VS2010, you can either using Async CTP or use this syntax http://msdn.microsoft.com/en-us/vstudio/hh533273.aspx 

   initializationTask.ContinueWith(()=> ...)

It is best to try this with a test project first.
于 2013-05-21T03:22:28.337 に答える