19.2 SrvRoutine のグローバル・スコープとローカル・スコープ

SrvRoutine を定義する場所は非常に重要な意味があります。同じ SrvRoutine を非同期に複数回実行する場合、つまり最初の呼び出しが完了しないうちに 2 番目の呼び出しを実行する場合は、特に重要です。

この理由から、一般的には SrvRoutine の定義にはローカル・スコープの使用が推奨されています。

ローカル・スコープ

次の例では、SrvRoutine はメソッド・ルーチン内に定義されています。

 

Mthroutine Name(Load)

* サービス・インスタンスの定義
Define_Com Class(#ServerModule.GetEmployees) Name(#GetEmployees)
  
* 非同期に実行
#GetEmployees.ExecuteAsync( #List)

   Evtroutine Handling(#GetEmployees.completed)

    * 処理完了

   Endroutine

 

   Evtroutine Handling(#GetEmployees.Failed)

    * 処理エラー

   Endroutine


Endroutine

このメソッドが呼び出される度に、新しい実行インスタンスが作成され、その結果 SrvRoutine の新しいインスタンスも作成されます。すべての処理が完了するまで、メソッド・ルーチンとその中の変数はすべてメモリに残されます。

グローバル・スコープ

次の例では、Srvroutine はメソッドの外に定義されています。

 

* サービス・インスタンスの定義
Define_Com Class(#ServerModule.GetEmployees) Name(#GetEmployees)

Mthroutine Name(Load)
   * 非同期に実行
   #GetEmployees.ExecuteAsync( #List)
Endroutine

Evtroutine Handling(#GetEmployees.completed)

   * 処理完了

Endroutine

 

Evtroutine Handling(#GetEmployees.Failed)

   * 処理エラー

Endroutine

 

つまり、ルーチンのインスタンスが 1 つだけ存在するということです。このルーチンを実行する複数の要求 (異なるパラメータ値による実行など) は、最終的に Web サーバーへの送信が複数回行われ、その結果、複数の Completed イベントが起動されることとなります。ですが、ルーチンのインスタンスは 1 つのみなので、複数の実行の違いを区別することができません。