2012-02-05 2 views
-3

StreamReader가 스레드 안전하지 않기 때문에 작동하지 않는 것 같네요. (Google은 도움이되지 않습니다. Google이 도움이되지 않습니다.)StreamReader ThreadSafe 문제? 혹시?

어쨌든 나는 정확히 무엇이 문제인지 정확하게 파악하려고 노력해 왔습니다. 이 코드는 80 %의 시간 동안 작동하고 다른 시간에는 들어오는 패킷을 구문 분석하지 못하고 그냥 삭제합니다.

이것은 http와 유사한 tcp 서버를 쓰는 경우 무효입니다. http 패킷과 똑같이 작동하지만 "CONTENT-LENGTH"헤더는 패킷 데이터 (페이로드)의 길이를 알려줍니다. 문제가 발생한 곳입니다. 누구든지이 방법을 개선하고 수정하는 방법을 제안 해 줄 수 있습니까? 왜냐하면 나는 완전히 잃어 버렸기 때문이다.

void InternalStart() 
    { 

     bool continueWhile = true; 
     while (continueWhile) 
     { 
      if (SR.EndOfStream) 
      { 
       continueWhile = false; 
       break; 
      } 
      if (par_ReadStatus != ReadStatusEnum.WaitingForPayload) 
      { 
       int charCode = SR.Peek(); 
       if (charCode == -1) 
       { 
        continueWhile = false; 
        break; 
       } 
       string outputLine = ""; 
       outputLine = SR.ReadLine(); 
       ReadLine(outputLine); 
      } 
      else if (par_ReadStatus == ReadStatusEnum.WaitingForPayload) 
      { 
       int length = int.Parse(par_ParsingPacket.Attributes["CONTENT-LENGTH"]); 
       char[] array = new char[length]; 
       for (int i = 0; i < length; i++) 
       { 
        array.SetValue(Convert.ToChar(SR.Read()), i); 
       } 
       string payload = new string(array); 
       ReadLine(payload); 
      } 
     } 
     if (ReadEnd != null) 
     { 
      ReadEnd(); 
     } 
    } 
+0

발생하는 오류에 대한 자세한 정보를 제공 할 수 있습니까? –

+0

가능한 복제본 [StreamWriter Multi Threading C#] (http://stackoverflow.com/questions/19304209/streamwriter-multi-threading-c-sharp) – Liam

답변

3

에서는 StreamReader가 아닌 스레드 안전 인,

간단한 (하우투 그 문제를 해결 모르는, 구글은 아무런 도움이되지 않습니다). 초급 프로그래머 수준 : 둘 이상의 스레드에서 StreamReader를 읽지 마십시오. 이렇게하려고하는 디자인은 스트림이 무엇인지, 효율적인 다중 스레드 프로그래밍이 얼마나 효과적인지 이해하지 못하는 것입니다.

단일 스트림 판독기에 여러 스레드가 도달 할 필요가 없습니다. 먼저 데이터를 처리 할 때 스레드를 독점적으로 특정 스레드에 할당해야합니다. 전문적이고 빠른 작업을 원한다면 IIS와 같은 작업을하고 인프라 스레드에서 데이터를 빨아 들인 다음 작업 패킷을 작업 큐로 보내면 여러 스레드가 작동합니다.

성능 요구 사항에 따라 소켓을 작동하고 비동기 소켓 메커니즘을 사용하여 많은 비용없이 진행중인 1000 개의 작업에 대해 1000 개의 스레드를 낭비하지 않도록 할 수 있습니다. 좋은 시도 -

어쨌든 난, 무슨 잘못이 코드와 정확히

아를 내기 위해 노력했습니다. 슬프게도 당신은 정말로 당신에게 어떤 문제가 있는지 알려주지도 않고, 쓰레드를 사용하는 코드를 보여 주지도 않습니다. 그래서 결국 질문과 코드가 조합되어서 말이 안됩니다.

+0

좋습니다. 감사 :) – Harold