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