2017-02-09 6 views
1

Мне нужно протестировать клиентское серверное приложение. У меня есть сервер, работающий на каком-то порту, и вам нужно создать около 2000 клиентов, подключающих сервер. Для этого я пытаюсь создать 2000 потоков в C# приложении, используя следующий кодНедостаточно памяти при создании потоков

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.OutOfmemory в for loop of Main method
Однако я проверил приложения потребляет только 110 MB памяти, когда это исключение поднятого?

Почему C# не позволяет мне создавать потоки в числах ..? Я также пробовал Thread Pool, но не работал ...

+0

Я могу сделать это с использованием 'ThreadPool' –

ответ

1

Существует ограничение количества потоков, которые вы можете создать. Вы можете проверить this answer, хотя и старый, но все же дает вам проблеск.

Я также читал на C# 5.0 in a Nutshell, что он занимает около 1 МБ в потоке, и поэтому задачи в большинстве случаев являются лучшими решениями, чем потоки. Вот почему есть пул потоков; потому что требуется некоторое время для подготовки и создания множества потоков.

Во-вторых, блокировка не несет нулевой стоимости. Это связано с тем, что каждый поток связывает около 1 МБ памяти до тех пор, пока он живет, а вызывает текущие административные издержки для CLR и . По этой причине блокирование может быть проблематичным в контексте сильно связанных программ ввода-вывода, которым необходимо han- dle сотен или тысяч одновременных операций. Вместо этого такие программы должны использовать подход, основанный на обратном вызове, rescind- во время ожидания их потока. Это (частично) цель асинхронных шаблонов, которые мы обсудим позже.

Смежные вопросы