2017-02-09 9 views
1

클라이언트 서버 응용 프로그램을 테스트해야합니다. 일부 포트에서 실행되는 서버가 있고 서버를 연결하는 약 2,000 개의 클라이언트를 만들어야합니다. 이를 위해 나는스레드 생성 중 시스템이 메모리가 부족합니다.

class Program 
{ 
    /// <summary> 
    /// Sample client code that makes gRPC calls to the server. 
    /// </summary> 
    public static void Main(string[] args) 
    { 
     for (int i = 0; i <= 2000; i++) 
     { 
      CalThread cThread = new CalThread(i);           
     } // Exception Raised Here 
    }  
} 

class CalThread 
{ 
    public CalThread(int clientID) 
    {    
     Thread thread = new Thread(() => getDataFromServer(clientID)); 
     thread.Start(); 
    } 
    public void getDataFromServer(int clientID) 
    { 
     try 
     { 
      //Channel channel = new Channel("192.168.0.123:50051", ChannelCredentials.Insecure); 
      while (true) 
      { 
       //Some code to connect to server and fetch data 
       Thread.Sleep(15000); 
      } 
     } 
     catch (Exception ex) 
     { 
      Thread.Sleep(15000); 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

여기에 예외이 예외를 발생 만 110 MB 메모리를 소비하지만 내가 확인했다 for loop of Main method
에서 응용 프로그램을 System.OutOfmemory 발생 다음 코드를 사용하여 C# 응용 프로그램 2000 개 스레드를 만들려고하고 있어요?

왜 C#은 숫자로 스레드를 만들지 못하게합니까? 나는 또한 Thread Pool을 시도했지만 작동하지 않습니다 ...

+0

'ThreadPool'을 사용하면 할 수 있습니다. –

답변

1

만들 수있는 스레드 수에는 제한이 있습니다. 오래되었지만 this answer을 확인할 수는 있지만 여전히 엿볼 수 있습니다.

나는 또한 C# 5.0 in a Nutshell에 읽습니다. 스레드 당 약 1MB가 걸리므로 대부분의 경우 스레드가 스레드보다 더 나은 솔루션입니다. 스레드 풀이있는 이유도 여기에 있습니다. 많은 스레드를 준비하고 만드는 데 언젠가 소요되기 때문입니다.

둘째, 블로킹은 비용이 들지 않습니다. 이는 각 스레드가 실제로 존재하는 한 약 1MB의 메모리를 묶어두고 은 CLR 및 운영 체제에 대한 지속적인 관리 오버 헤드를 유발하기 때문입니다. 이러한 이유 때문에 수백 또는 수천 개의 동시 작업을 수행해야하는 과도한 I/O 바인딩 프로그램과 관련하여 블로킹이 번거로울 수 있습니다 ( ). 대신, 같은 프로그램은 콜백 기반 접근 방식을 사용할 필요가 있습니다. 대기 중에 스레드를 완전히 종료해야합니다. 이것은 부분적으로는 나중에 논의 할 비동기 패턴의 포즈이다.