2011-12-31 20 views
4

IIS 7の下にWebアプリケーションがあります。Button1というページがあります。私はこのButton1以下の方法火災をクリックすると:IISマルチスレッド

string url = "http://example.com"; 

string resultStr = ""; 

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 

string encoding = resp.CharacterSet; 
if (encoding.Equals(String.Empty)) encoding = "UTF-8"; 

Stream strResponse = resp.GetResponseStream(); 

int bytesSize = 0, c = 0; 
byte[] downBuffer = new byte[2048];//2kb 

while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0) 
{ 
    if (++c > 100) break;//200kb - max 
    downBuffer = Encoding.Convert(Encoding.GetEncoding(encoding), Encoding.UTF8, downBuffer); 

    string tempString = Encoding.UTF8.GetString(downBuffer, 0, bytesSize); 
    resultStr += tempString; 
} 

strResponse.Close(); 

TextBox1.Text = resultStr; 

をあなたはTextBox1テキストボックスは、リモートページのHTMLコードが含まれています見ることができるように。

問題があります:このメソッドは実行中は他のページを読み込めません!この問題を解決するには?

私は、アプリケーションスレッドが複数のスレッドを同時に処理できるようにアプリケーションスレッドを格納するアプリケーションプールがあることを知っています...しかし、それは私のためには機能しません。どうして?

+2

このコードを実行しているときに、同じアプリケーションから2番目のタブを開いてページを読み込むことはできませんか?それとも、コードが終了するまで現在のページがリロードされないということですか?最初は奇妙、2番目は設計によるものです。 – rene

+0

私は最初のことを意味します。そして私にとっても奇妙です... 2番目のタブを開くと、最初のページからのリクエストが実行されている間は別のページが表示されません。 –

答えて

2

あなたのアプリケーションでSessionを使用していると思われますか?セッションはスレッドセーフではありません。つまり、セッションを使用している場合、ASP.NETは要求全体をロックし、他の要求(同じセッションの)を並行して実行することを許可しません。同じセッションからの要求は順次実行されます。あなたは、異なるセッションから複数の要求を同時に実行することができます。

実際、それよりも少し微妙です。 ASP.NETはReaderWriterLockを使用してセッションオブジェクトへのアクセスを同期します。つまり、同じセッションから2つの要求を並列に実行する2つの要求を持つことができますが、セッションへの書き込みアクセス権があればブロックします同じセッションからの他の並列要求。

ページ内のEnableSessionState="ReadOnly"を使用して制御できます。これは、セッションからの読み取りのみであり、要求の並列実行を許可することを示します。

+0

2番目のページで別のブラウザを開いています。 2番目のブラウザにもう1つのセッションが存在するため、正常に動作します。 あなたはたくさん! –

+0

@ user1025125、うれしく思った。あなたに聞いてみたいことが他にありますか、あるいはこのスレッドを閉じることを検討できますか? –