2011-10-28 7 views
2

ローカルのdevサーバ(cassini?)で動作するVS2010のWebProjectをデバッグしています。 aspxページの1つがManualResetEvent.WaitOne()を呼び出し、別のページaspxページがManualResetEvent.Set()(同じグローバルオブジェクト上)を呼び出して最初のページを解放します。Visual Studio Asp.Net開発サーバーは本当にマルチスレッドですか?

VS2010のスレッドリストを見ると、ワーカースレッドがたくさんあるようです。ただし、WebサーバーはManualResetEvent.WaitOne()呼び出しでブロックされている間は何も処理を停止するようです。したがって、.WaitOne()がタイムアウトしない限り、ManualResetEvent.Set()はロードされません。

ここでは何が起こっていますか?

// Sample Code 

Class SyncTest { 

private System.Threading.ManualResetEvent eConnected = 
     new System.Threading.ManualResetEvent(false); 
private bool isConnected; 

public SyncTest() 
{ 
    this.isConnected = false; 
} 

public void SetConnected(bool state) 
{ 
    isConnected = state; 
    if (state) 
     eConnected.Set(); 
    else 
     eConnected.Reset(); 
} 

public bool WaitForConnection(int timeout) 
{ 
    return eConnected.WaitOne(timeout); 

} 
} 
+0

メイン実行スレッドを実際に停止するべきではありません。これは、開始するワーカースレッドで正常に動作します。同様に、セッション間で話したい場合は、アプリケーションオブジェクトを使用する方が優れたメカニズムがあります。 –

+0

@SimonHalseyメインexecスレッドはこれの影響を受けません。それは実際にセッションロックに関連していました。 – MandoMando

答えて

3

Webサーバーは、各ユーザーから一度に1ページずつ処理します。

1人のユーザーから要求されたページを並行して実行したい場合は、セッションレスでページを作成する必要があります。

@Pageの指示文にEnableSessionState="false"を入れて、セッションレスにします。

これはもちろん、セッションデータを使用してリクエストを識別できないことを意味します。誰がページをリクエストしたのかを知りたければ、リクエストでそれを送信する必要があります。

+0

ありがとう!これはIISにも当てはまりますか? – MandoMando

+1

@MandoMando:はい。 – Guffa

関連する問題