[ |../../index.htm#lansa/vlwebeng03_0105.htm]
現在地:
20.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 つのみなので、複数の実行の違いを区別することができません。
[ |../../index.htm#lansa/vlwebeng03_0105.htm]