2011-01-13 5 views
1

단일 스레드에서 실행되는 C# HttpListener를 사용하여 다른 프로그램에서 보낸 데이터를 구문 분석합니다. 내 주요 문제는 서버에 전송 된 모든 데이터를 수신하지 않습니다. 이 문제는 단일 스레드에서 실행되는 한계로 인해 발생한다고 가정합니다. 나는 단순한 멀티 스레딩 솔루션을 위해 높고 낮음을 검색하여 모든 데이터를 수신하고 빈 손으로 나왔습니다. 이것을 멀티 스레드 응용 프로그램으로 바꾸는 데 도움이된다면 많은 도움이 될 것입니다.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. 을 전송되는 데이터의 양을
  2. 수신되는 데이터의 양
  3. 이 얼마나 데이터
  4. 에서 작동하도록 걸립니까는 데이터를 전송하기 위해 얼마나 걸립니까

HTTP는 일반적으로 전달을 보장하므로 작동 시간이 오래 걸리더라도 서버에서 들어오는 모든 정보를 가져와야합니다.

당신 같은
  1. 하나의 스레드가 지금 (LISTENER 스레드), 수신 데이터를 받아왔다 :

    은 여전히 ​​프로세스가 멀티 스레드 만들고 싶어, 나는 다음과 같은 설계를 추천했다 그 .
  2. 들어오는 데이터를 처리 할 다른 스레드 세트 (작업자 스레드).
  3. 리스너 스레드는 데이터를 수신하여 대기열에 배치합니다.
  4. 작업자 스레드는 큐를 큐에서 제거하고 데이터에서 작동합니다.

여러 노트와 일하지만, 생각하기 : 스레드 동기화의

  1. 테이크 케어 - 특히, 대기열을 보호해야합니다.
  2. 작업자 스레드가 데이터를 가져 오는 것이 중요한지 생각하십시오. 특정 작업 스레드를 처리해야하는 여러 개의 청크가있는 경우이 문제를 해결해야합니다.
  3. 경우에 따라 리스너 스레드에 매우 높은 부하가 있으면 큐가 병목 현상을 일으킬 수 있습니다. 즉, 큐의 잠금이 병목 현상을 일으킬 수 있습니다. 이 경우 N 개의 작업자 스레드에 대한 N 개의 대기열 모델로 이동하여 라운드 로빈 방식으로 하나를 선택하도록 권장합니다. 이것은 자물쇠를 최소화 할 것이고 실제로 당신은 자물쇠가 없어도 벗어날 수있는 하나의 리더기와 하나의 작가를 가질 것이기 때문에 (그러나 이것은 그 해답의 범위를 벗어난다).

또 다른 옵션은 스레드 풀을 사용하는 것입니다. 스레드 풀은 필요할 때까지 최대 절전 모드로 전환되는 스레드 풀입니다. 리스너가 들어오는 입력을 받으면이를 자유 스레드에 할당하거나 필요한 경우 풀을 확대합니다. 이렇게하면 대기열이없고 스레드가 최적으로 사용됩니다.

관련 문제