2011-01-13 3 views
1

私はC#HttpListenerを1つのスレッド上で実行し、別のプログラムによって送られたデータを解析します。私の主な問題は、サーバーに送信されたすべてのデータが受信されるわけではありません。私は、これが単一のスレッド上で実行されることの限界に起因すると仮定しています。私はシンプルなマルチスレッドソリューションのために最高値と最低値を検索していますので、それに送られたすべてのデータを受け取って、空の状態で手を出しました。これをマルチスレッドアプリケーションに変換する際の助けになると大変感謝しています。C#シングルからマルチスレッドへの切り替え

private void frmMain_Load(object sender, EventArgs e) 
    { 
     Thread t = new Thread(new ThreadStart(ThreadProc)); 
     t.Start(); 
    } 

    public static void ThreadProc() 
    { 
     while (true) 
     { 
      WebBot.SimpleListenerExample(new string[] { "http://localhost:13274/" }); 
      //Thread t = new Thread(new ThreadStart(ThreadProc)); 
      //t.Start(); 
      Application.DoEvents(); 
     } 
    } 

答えて

1

まず最初に、あなたの仮説が本当に正しいことを確認してください。あなたは確認する必要があります:

  • どのくらいの時間がどのくらいの時間がデータを操作するために取るんデータ
  • を送信するために取るんを受けているどのくらいのデータ
  • に送信され

    1. どのくらいのデータ

    HTTPは一般的に配信を保証するため、長い時間がかかる場合でも、サーバーはすべての受信情報を取得している必要があります。あなたが今(リスナースレッド)を持っているよう

    1. 1つのスレッド、入ってくるデータを受け入れる:あなたはまだプロセスがマルチスレッドにしたい場合は、私は次のようなデザインをお勧めします、と述べ

    2. 着信データを処理する別のスレッドセット(ワーカースレッド)。
    3. リスナースレッドは、データを受信して​​キューに配置します。
    4. ワーカースレッドはキューをデキューし、データを操作します。しかし

    いくつかの注意事項と考えるべき事、:

    1. は、スレッドの同期の世話をする - 具体的には、あなたはキューを保護する必要があります。
    2. どのワーカースレッドがデータを取得するかが重要かどうかを考えます。特定のワーカースレッドを処理する必要のあるチャンクが複数ある場合は、この問題に対処する必要があります。
    3. リスナースレッドに負荷が非常に高い場合、キューがボトルネックになるか、より正確にはキューのロックがボトルネックになることがあります。この場合、N個のワーカースレッド用のN個のキューのモデルに移行し、リスナーにラウンドロビン方式で1個だけを選択させることをお勧めします。これはロックを最小限に抑えます。実際には、1つのリーダーと1つのライターがあるので、ロックなしで逃げることもできます(しかし、これはその答えの範囲外です)。

    さらに別のオプションは、スレッドプールを使用することです。スレッドプールは、必要になるまで休止状態にあるスレッドのプールです。リスナーが入力を受け取ると、それは空きスレッドに割り当てられます。必要に応じてプールが拡大されます。この方法ではキューがなく、スレッドが最適に使用されます。

  • 関連する問題