在ThreadPool中收集垃圾?

时间:2014-12-02 15:03:19

标签: c# multithreading garbage-collection threadpool

我需要处理http请求,我发现使用ThreadPool的最佳方法。请不要推荐使用完成的库,因为当我尝试做类似的事情时,会出现同样的问题!

在我自己的网络服务器上尝试使用DDOS-Tool时,CPU使用率会很高,内存会快速增加!

当我停止工具时,内存使用量仍会增加(见截图)!

我希望程序在DDOS-Tool停止后减少内存使用量。

但不幸的是它没有!

这是我的代码:你可以尝试一下。它不需要任何库!

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using System.Threading;

namespace Webserver
{
  class Program
  {
    static void Main(string[] args)
    {
      TcpListener tcpListener = new TcpListener(81);
      tcpListener.Start();
      while (true)
        ThreadPool.QueueUserWorkItem(DoWork, tcpListener.AcceptTcpClient());
    }

    static void DoWork(object arg)
    {
      try
      {
        using (TcpClient tcpClient = (TcpClient)arg)
        {
          tcpClient.ReceiveTimeout = 500;
          tcpClient.SendTimeout = 500;

          using (NetworkStream networkStream = tcpClient.GetStream())
          {
            networkStream.ReadTimeout = 500;
            networkStream.WriteTimeout = 500;

            List<string> headers = new List<string>();

            using (StreamReader streamReader = new StreamReader(networkStream))
            using (StreamWriter streamWriter = new StreamWriter(networkStream))
            {
              while (true)
              {
                string line = streamReader.ReadLine();

                if (line == "") break;
                else headers.Add(line);
              }

              Console.WriteLine(headers[0]);

              streamWriter.WriteLine("HTTP/1.0 200 OK");
              streamWriter.WriteLine("Server: Webserver");
              streamWriter.WriteLine("Content-Type: text/html; charset=UTF-8");
              streamWriter.WriteLine("");
              streamWriter.WriteLine("Hello World!");
            }
          }
        }
      }
      catch (Exception ex)
      {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(ex.Message);
        Console.ResetColor();
      }
    }
  }
}

Screenshot of Process Hacker's statistcs

红线标记了我启动和停止ddos-Tool时的时间戳。如您所见,工具停止后内存仍会增加。

我希望我的程序能够像开始时一样减少17 MB的内存使用量。

1 个答案:

答案 0 :(得分:-1)

similar question有一些很好的建议。

您的代码目前已经非常高效。 using语句在完成后自动处理对象,因此您不必担心它们。至于在任何地方使用垃圾收集总是一件棘手的事情,特别是在多线程环境中。

要使用垃圾收集,只需输入:

// for a full garbage collection:
GC.Collect();
// for a first generation garbage collection:
GC.Collect(0);

这迫使垃圾收集者“收集”垃圾。垃圾收集是线程安全的,它会阻止所有其他线程。由于其他线程被阻止,可能会导致一些延迟。我不确定它是否能提高你的表现,但请务必尝试。

有关其工作原理的详细信息,请参阅this article