2017-02-09 33 views
1

我需要測試客戶端服務器應用程序。我有服務器運行在某個端口上,需要創建大約2000個連接服務器的客戶端。對於這個我嘗試使用下面的代碼創建線程時系統內存不足

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); 
     } 
    } 
} 

這裏例外發生在System.OutOfmemoryfor loop of Main method
但是我已經檢查應用程序消耗時此異常只籌集到110 MB內存中創建在C#應用程序2000多個線程?

爲什麼c#不讓我在數字中創建線程..? 我也試過Thread Pool但不能正常工作...

+0

我可以使用'ThreadPool' –

回答

1

有多少線程可以創建。你可以檢查this answer,雖然舊,但仍然給你一瞥。

我也讀過C# 5.0 in a Nutshell,每個線程大概需要1MB,這就是爲什麼在大多數情況下任務比線程更好的解決方案。這也是爲什麼有一個線程池;因爲準備和創建大量線程需要一些時間。

其次,阻塞不會產生零成本。這是因爲每個 線程只要佔用大約1MB的內存,並且會導致CLR和 操作系統的持續管理開銷。由於這個原因,在需要數百或數千併發操作的大量I/O限制程序的情況下,阻塞可能是麻煩的。相反,這樣的程序需要在等待時完全使用基於回調的方法,rescind- 。這是(部分)我們稍後將討論的異步模式的姿態。