我需要处理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();
}
}
}
}
红线标记了我启动和停止ddos-Tool时的时间戳。如您所见,工具停止后内存仍会增加。
我希望我的程序能够像开始时一样减少17 MB的内存使用量。
答案 0 :(得分:-1)
这similar question有一些很好的建议。
您的代码目前已经非常高效。 using语句在完成后自动处理对象,因此您不必担心它们。至于在任何地方使用垃圾收集总是一件棘手的事情,特别是在多线程环境中。
要使用垃圾收集,只需输入:
// for a full garbage collection:
GC.Collect();
// for a first generation garbage collection:
GC.Collect(0);
这迫使垃圾收集者“收集”垃圾。垃圾收集是线程安全的,它会阻止所有其他线程。由于其他线程被阻止,可能会导致一些延迟。我不确定它是否能提高你的表现,但请务必尝试。
有关其工作原理的详细信息,请参阅this article