- PR -

クライアントより複数の要求が来た場合の動作について

投稿者投稿内容
みっちー
常連さん
会議室デビュー日: 2006/01/06
投稿数: 22
投稿日時: 2006-05-10 16:28
お世話になります。
ASP.NETでWebアプリを開発しております。

同一セッション内で、クライアントより複数の要求が来た場合、
内部的には、マルチスレッドで動作していると思われるのに、
並列動作しません。

例えば、子画面においてサーバサイドで時間のかかる処理を行っている場合、
親画面での、ポストバック処理などが子画面の処理が完了するまで
走らなくなってしまいます。

別セッションの場合は、問題なく並列動作します。

同一セッションの場合のみ、何か制限が掛かっているのでしょうか?
そうであれば、制限を外す事などは可能でしょうか?

ご教授いただければと思います。

■環境
Windows Server 2003
IIS 6.0
VisualStudio.NET 2003
Webアプリ(C#)
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-10 16:40
書いたことが無いのであまり詳しくないのですが・・・

引用:

みっちーさんの書き込み (2006-05-10 16:28) より:

例えば、子画面においてサーバサイドで時間のかかる処理を行っている場合、
親画面での、ポストバック処理などが子画面の処理が完了するまで



時間のかかる処理がタイムシュアリングの邪魔をすることがあるのですが、そういう
可能性は無いんでしょうか?
みっちー
常連さん
会議室デビュー日: 2006/01/06
投稿数: 22
投稿日時: 2006-05-10 16:56
私もそれを疑って、CPU使用率を下げるように適当にスリープを入れてみたのですが、効果ありませんでした。
少なくとも、Page_Load()や各イベントハンドラを抜けるまでは、次のスレッドが動作しないように思えます。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-05-10 17:05
時間がかかる処理の結果をセッション変数にいれようとしてるためにセッション変数がその処理の間ロックされてて、親画面のほうでも同じセッション変数を使おうとしてて順番待ちになってる、なんてことはないですか?

#いや、本当にそう動くかどうか試してないのでわかりませんが。。。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-05-10 17:05
global.asaxでASP.NETランタイムの処理を見張ってみると
同一セッションで時間の処理を行ってるいる場合

Application_ResolveRequestCacheイベントは発生しますが
Application_AcquireRequestStateイベントは時間のかかる処理が終了しないと発生しません。
おそらくセッション情報を復元するSessionStateModuleとやらが、同一セッションのスレッドが動作してないかチェックして、動作しているようだったらスレッドが終了するまで待っているのではないでしょうか?
そうしないと、複数のスレッドが同一セッションに書込み、読込みを行った場合に同期処理が大変だからのような気もします。
「.NET エンタープライズWebアプリケーション開発技術大全Vol3」
によると、SessionStateModuleなどを独自に開発することは理論上可能なようですが、難易度が高くオススメできないそうです。

[ メッセージ編集済み 編集者: burton999 編集日時 2006-05-10 17:06 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-05-10 17:28
引用:

みっちーさんの書き込み (2006-05-10 16:28) より:
同一セッション内で、クライアントより複数の要求が来た場合、
内部的には、マルチスレッドで動作していると思われるのに、
並列動作しません。


仕様だったはずです。
同一のセッションは同一のスレッドで動作するようになっていたはずです。
制約を外すことは多分できないと思います。
※カスタムのセッション管理機能を作成したりしない限り。
みっちー
常連さん
会議室デビュー日: 2006/01/06
投稿数: 22
投稿日時: 2006-05-10 17:36
皆様、情報提供ありがとうごさいます。

同一セッションで、HTTPの要求は一つずつしか処理できないという事でしょうか。
自作のスレッドは同一セッション内で並列動作するので(セッション変数は自力でロックをかけています)、"HTTP要求は一つずつ処理が仕様"と考えるのが妥当のようです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-05-13 21:53
デバッグ構成(web.config)だと、シングル スレッドになるんじゃなかったっけ?

1.x のドキュメントが、見つからない。。。
引用:

高パフォーマンス ASP.NET アプリケーションの開発 より:
デバッグ モードを確実に無効化します。製品版アプリケーションを配置する前またはパフォーマンス測定を実行する前には、必ずデバッグ モードを無効化してください。デバッグ モードが有効な場合、アプリケーションのパフォーマンスが著しく低下することがあります。Web.config ファイルでアプリケーションのデバッグ モードを設定する場合の構文情報については、「ASP.NET 設定スキーマ」を参照してください。



[ メッセージ編集済み 編集者: Jitta 編集日時 2006-05-13 22:03 ]

スキルアップ/キャリアアップ(JOB@IT)