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 つのみなので、複数の実行の違いを区別することができません。