gpt4 book ai didi

c# - 具有等待异步和任务的多线程 HttpListener

转载 作者:IT王子 更新时间:2023-10-29 04:19:20 24 4
gpt4 key购买 nike

这是一个可扩展的多线程 HttpListener 的好例子吗?

例如,真正的 IIS 会这样做吗?

public class Program
{
private static readonly HttpListener Listener = new HttpListener();

public static void Main()
{
Listener.Prefixes.Add("http://+:80/");
Listener.Start();
Listen();
Console.WriteLine("Listening...");
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}

private static async void Listen()
{
while (true)
{
var context = await Listener.GetContextAsync();
Console.WriteLine("Client connected");
Task.Factory.StartNew(() => ProcessRequest(context));
}

Listener.Close();
}

private static void ProcessRequest(HttpListenerContext context)
{
System.Threading.Thread.Sleep(10*1000);
Console.WriteLine("Response");
}
}

我正在寻找一种不依赖 IIS 的可扩展解决方案。而仅在 http.sys(它是 httplistener 类)上——不依赖 iIS 的原因是政府。我工作的区域需要极小的攻击表面积。

最佳答案

我在 https://github.com/JamesDunne/Aardwolf 做了类似的事情并对此做了一些广泛的测试。

请参阅 https://github.com/JamesDunne/aardwolf/blob/master/Aardwolf/HttpAsyncHost.cs#L107 处的代码用于核心事件循环的实现。

我发现使用 Semaphore 来控制有多少并发 GetContextAsync 请求处于事件状态是最好的方法。本质上,主循环会继续运行,直到信号量由于达到计数而阻塞线程。然后将有 N 个并发的“连接接受”处于事件状态。每次接受连接时,信号量都会被释放,新的请求可以取而代之。

信号量的初始值和最大计数值需要一些微调,具体取决于您期望接收的负载。这是您期望的并发连接数与客户期望的平均响应时间之间的微妙平衡。较高的值意味着可以维持更多的连接,但平均响应时间要慢得多;更少的连接将被拒绝。较低的值意味着可以保持较少的连接,但平均响应时间要快得多;更多连接将被拒绝。

我发现,通过实验(在我的硬件上),128 左右的值允许服务器在可接受的响应时间内处理大量并发连接(最多 1,024)。使用您自己的硬件进行测试并相应地调整您的参数。

我还发现 WCAT 的单个实例本身不喜欢处理超过 1,024 个连接。因此,如果您认真对待负载测试,请针对您的服务器使用带有 WCAT 的多台客户端计算机,并确保通过快速网络进行测试,例如10 GbE 并且您的操作系统的限制不会减慢您的速度。请务必在 Windows Server SKU 上进行测试,因为默认情况下桌面 SKU 是有限的。

总结:如何编写连接接受循环对于服务器的可伸缩性至关重要。

关于c# - 具有等待异步和任务的多线程 HttpListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11167183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com