创建线程时系统内存不足

时间:2017-02-09 05:16:02

标签: c# multithreading client-server

我需要测试客户端服务器应用程序。我有服务器在某个端口上运行,需要创建大约2000个连接服务器的客户端。为此,我尝试使用以下代码在c#应用程序中创建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异常 但是我已经检查过应用程序在引发此异常时仅消耗Thread Pool内存?

为什么c#不允许我在数字中创建线程..? 我也试过 <input type="text" id="ocd" size="25" title="Closure Date" placeholder="Possible Closure Date " runat="server"> // where this exists in dd-mm-yyyy format <input type="text" id="od" size="25" title="Closure Date" placeholder=" Date Of Opportunity" runat="server"> // where this exists in dd-mm-yyyy format <asp:CompareValidator ID="CompareValidator1" ValidationGroup = "Date" ForeColor = "Red" runat="server" ControlToValidate = "od" ControlToCompare = "ocd" Operator = "LessThanEqual" Type = "Date" ErrorMessage="Receipt date must be less than Closure date."></asp:CompareValidator> 但没有工作......

1 个答案:

答案 0 :(得分:1)

您可以创建多少个线程。你可以查看this answer,虽然很旧,但仍然可以一瞥。

我还在C# 5.0 in a Nutshell上读到每个线程大约需要1MB,这就是为什么在大多数情况下,任务是比线程更好的解决方案。这也是为什么有一个线程池;因为准备和创建大量线程需要一些时间。

  

其次,阻塞不会产生零成本。这是因为每一个   只要它存在,线程就会占用大约1MB的内存   导致CLR的持续管理开销   操作系统。因此,阻塞可能很麻烦   在大量I / O绑定程序的背景下,需要   数百或数千个并发操作。代替,   这样的程序需要使用基于回调的方法,取消 -   在等待时完全完成他们的线程。这(部分)是   我们将在稍后讨论的异步模式的构成。