2017-02-09 8 views
1

クライアントサーバーアプリケーションをテストする必要があります。いくつかのポートでサーバーを実行しており、サーバーに接続する約2000のクライアントを作成する必要があります。このために私は、アプリケーションをチェックしているが、例外System.OutOfmemory
for loop of Main method中に発生ここで次のコードスレッドを作成中にシステムがメモリ不足になる

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

を使用してC#アプリケーションで2000件のスレッドを作成しようとしています。この例外が発生したときにのみ110 MBメモリを消費?

なぜC#の番号でスレッドを作成できません。 私もThread Poolを試しましたが、動作していません...

+0

私は 'ThreadPool'を使ってそれを行うことができました –

答えて

1

作成できるスレッドの数には制限があります。あなたはthis answerをチェックすることはできますが、古いですが、それでもあなたに垣間見ることができます。

私はまた、C# 5.0 in a Nutshellに1スレッドあたり約1MBの容量が必要であることを読みました。そのため、ほとんどの場合、タスクはスレッドよりも優れたソリューションです。スレッドプールがある理由もそうです。多くのスレッドを準備して作成するのはいつかかかります。

第2に、ブロッキングにはコストがかかりません。これは、各 スレッドが存続する限り、約1MBのメモリを占有し、 がCLRと オペレーティングシステムの継続的な管理上のオーバーヘッドを引き起こすためです。この理由から、ブロッキングは、数百または数千の同時操作を必要とする、高度にI/Oに依存するプログラムのコンテキストでは、 という面倒なことがあります。代わりに、 そのようなプログラムはコールバックベースのアプローチを使用する必要があります。待機中にスレッドを完全に終了させる必要があります。これは、後に説明する非同期パターンのポーズ(一部)です。

関連する問題