2017-01-08 10 views
1

以下のコードでは、doitを呼び出すHttpTaskAsyncHandlerがあり、最初に5秒遅れてブラウザに文字列を書き出します。HttpTaskAsyncHandler - ブロックするようですが、何かが間違っていることを知っています

2つのブラウザタブを開いて、このページを両方とも呼び出すとします。最初の応答は5秒で、2番目の応答は10秒になります。

最初に2番目の要求が完了するのを待つのはなぜですか?遅れは、仕事をするのにかかる時間を表すことに過ぎませんでした。

public class MyHandler : HttpTaskAsyncHandler 
{ 
    public override bool IsReusable 
    { 
     get 
     { 
      return true; 
     } 
    } 

    public override Task ProcessRequestAsync(HttpContext p_ctx) 
    { 
     return doit(p_ctx); 
    } 

    static int _count = 0; 
    async Task doit(HttpContext p_ctx) 
    { 
     await Task.Delay(5000); 
     p_ctx.Response.Write("doit " + (++_count).ToString()); 
    } 

} 

答えて

0

Asyncは同時性を意味しません。 Asyncハンドラを定義すると、基本的にスレッドプールにスレッドを返すことを意味します(awaitingコール)。

あなたのケースでは、IIS Expressがリクエストをキューに入れることがあります。

エキス

ASP.NETセッション状態へのアクセスは、セッションごとに排他的であることを意味同時要求し、セッション状態

http://msdn.microsoft.com/en-us/library/ms178581.aspxから:それはセッションに排他ロックを必要とするので、それはこれを行います2人の異なるユーザーが同時リクエストを行う場合、それぞれの別々のセッションへのアクセスは同時に許可されます。ただし、同じSessionID値を使用して同じセッションに対して2つの同時要求が行われた場合は、が最初の要求でセッション情報に排他的にアクセスします。 2番目の要求は、最初の要求が完了した後にのみ実行されます。また、@ PageディレクティブのEnableSessionState値がReadOnlyに設定されている場合、読み取り専用の要求が発生した場合は、セッション情報がセッションデータに排他的なロックをもたらすことはありません。ただし、セッションデータの読み取り専用要求では、セッションデータがクリアされるための読み取り/書き込み要求によってロックが設定されるのを待機する必要があります。

可能なオプション:

  • 別のブラウザ(またはシークレットモード)での第2の要求を実行し
  • を無効のSessionState
+0

ありがとうございました。私はこれを考慮しなかった。あなたが言及したような別のブラウザやシークレットでテストしたはずです。それは確かに問題でした。 – gkelly

+0

助けになるのはうれしい!答えがあなたを助けたならば、upvote/acceptは答えです。 – Kenneth

+0

はアップヴォートが好きですが、私は新しいユーザーです。明らかに私の意見はまだ数えられません。 – gkelly

関連する問題