1

私がC#(コードの一部)で書いた単純なマルチスレッドWebサーバーがあります:

  public class MyServer
    {
        private readonly HttpListener _listener = new HttpListener();
        private int  _dataId;
        public HttpServer(string prefix, string folder)
        {
            System.Threading.ThreadPool.SetMaxThreads(50, 1000);
            System.Threading.ThreadPool.SetMinThreads(50, 50);
            //........
        }

        public void Start()
        {
            _listener.Start();
            while (true)
             ThreadPool.QueueUserWorkItem(ProcessRequest, _listener.GetContext());
        }


        private void ProcessRequest(object obj)
        {
           //.....
        }


}

ブラウザ(またはメインスレッドを1つだけ使用するもの)でリクエストを送信する場合は、すべて問題ありません。ただし、以下のコードで実行すると、サーバーは通常、さまざまなリクエストに対して同じ値を受け取ります。

あなたの考えは?

-編集-:

簡単な質問は、ローカル変数のみを使用することで、コードがスレッドセーフであることを確認できますか?逆もまた同様です。インスタンス変数(静的ではなく、私の場合は_dataIdlock )を使用している場合、スレッドセーフにするために(たとえば、キーワードによって)それらを「管理」する必要がありますか?

4

2 に答える 2

1

マルチスレッド方式でHttpListenerを使用する標準的な方法は、Begin/End非同期パターンを使用することです。ここに例を示します。

ハンドラーメソッドが再入可能である場合、つまりインスタンスの状態に依存しない場合は、コードがスレッドセーフである可能性が高くなります。問題は、使用するクラスやメソッドなどもスレッドセーフかどうかです。

于 2012-11-04T17:45:01.053 に答える
-1

同じコンテキストを複数回キューに入れるのではなく、GetContextをサイクルで呼び出す別のスレッドを開始する必要があります。

public void Start()
{
    _listener.Start();
    ThreadPool.QueueUserWorkItem(StartImpl);
}
public void StartImpl()
{
    while (true)
        ProcessRequest(_listener.GetContext());
}
于 2012-11-04T15:58:27.860 に答える