2

このようないくつかのaspチュートリアルでは、次のパターンを観察します。

アプリケーション.ロック

'アプリケーションオブジェクトでいくつかのことを行います

アプリケーション.ロック解除

ただし、Web ページには複数のインスタンスを含めることができるため、明らかに並行性の問題があります。だから私の質問は次のとおりです。

オブジェクトがすでにロックされているときに、あるページをロックしようとするとどうなりますか?

アプリケーション オブジェクトがロックされているかどうかを検出する方法はありますか?

ロックされていないアプリケーション オブジェクトで作業する方が良いですか、それとも他の結果がありますか?

アプリケーション オブジェクトに関連するアクションが 1 つしかない場合はどうなるでしょうか。〜その場合、ロック/ロック解除する理由はありますか?

4

3 に答える 3

3

MSDNドキュメントから:

このLockメソッドは、他のクライアントがApplicationオブジェクトに格納されている変数を変更するのをブロックし、一度に1つのクライアントのみがApplication変数を変更またはアクセスできるようにします。

メソッドを明示的に呼び出さない場合、.aspファイルが終了するかタイムアウトApplication.Unlockになると、サーバーはロックされたアプリケーションオブジェクトのロックを解除します。

ページの処理が完了するかタイムアウトになるとアプリケーションオブジェクトのロックが解除されるため、アプリケーションオブジェクトのロックは非常に短時間持続します。

1つのページがアプリケーションオブジェクトをロックし、最初のページがまだロックされている間に2番目のページが同じことを行おうとすると、2番目のページは最初のページが終了するかServer.ScriptTimeout制限に達するまで待機します。

例:

<%@ Language="VBScript" %> 
<% 
   Application.Lock  
   Application("PageCalls") = Application("PageCalls") + 1  
   Application("LastCall") = Now()  
   Application.Unlock  
%>  

This page has been called <%= Application("PageCalls") %> times.

上記の例では、このLockメソッドは、一度に複数のクライアントが変数PageCallsにアクセスするのを防ぎます。アプリケーションがロックされていなかった場合、2つのクライアントが同時に変数PageCallsをインクリメントしようとする可能性があります。

于 2008-10-04T16:39:58.277 に答える
2

ロックされていないアプリケーション オブジェクトを使用すると、結果が生じます。たとえば、グローバル カウンターを実装する場合:-

Application("myCounter") = Application("myCounter") + 1

上記のコードは時々ミスカウントします。このコードは読み取り、追加、割り当てを行います。2 つのスレッドが同時にこれを実行しようとすると、同じ値を読み取った後、myCounter を 2 ではなく 1 ずつインクリメントして同じ値を書き込む可能性があります。

必要なのは、2 番目のスレッドが myCounter に書き込むまで、2 番目のスレッドが myCounter を読み取れないようにすることです。したがって、これはより良いです:-

Application.Lock

Application("myCounter") = Application("myCounter") + 1

Application.Unlock

もちろん、ロックが長時間保持されている場合、特にロックを保持しているコードの影響を受けないアプリケーションの用途が他にある場合は、同時実行性の問題があります。

したがって、アプリケーションで長いロックを必要とする設計は避ける必要があります。

于 2008-10-04T15:12:21.027 に答える
1

すでにロックされている Application オブジェクトを 1 つのページがロックしようとすると、ロックを保持しているページがロックを解除するまで待機します。これは通常は迅速です (ASP コードは通常、アプリケーションに保存されている共有オブジェクトにアクセスするのに十分な時間だけロックを保持する必要があります)。

于 2008-10-04T14:56:27.660 に答える