HttpListener在不同的计算机上的行为有所不同

时间:2018-02-06 15:10:26

标签: c# concurrency httplistener

我最近一直在玩HttpListener类并测试一些东西,我最后编写了这段代码(这完全是实验性的,不仅仅用于生产而非教育目的)

 private static async Task ProcessRequestContext(HttpListenerContext ctx)
    {
        Console.WriteLine("New Context Process call");
        await Task.Delay(5000);

        Stream sOut = ctx.Response.OutputStream;
        byte[] data = Encoding.UTF8.GetBytes("H3ll0 w0rld!");
        ctx.Response.ContentLength64 = data.Length;
        ctx.Response.AppendHeader("Cache-Control", "no-cache"); 
        ctx.Response.AppendHeader("Cache-Control", "no-store");
        ctx.Response.AppendHeader("Cache-Control", "must-revalidate");
        ctx.Response.AppendHeader("Pragma", "no-cache");
        ctx.Response.AppendHeader("Expires", "0");

        sOut.Write(data, 0, data.Length);
        sOut.Flush();
        sOut.Close();

        Console.WriteLine("Responded @ " + DateTime.Now.ToString());
    }

    private static async Task listener()
    {
        HttpListener http = new HttpListener();
        http.Prefixes.Add("http://127.0.0.1:8080/");

        http.Start();
        Console.WriteLine("Started on http://127.0.0.1:8080/");
        while (true)
        {
            var context = await http.GetContextAsync();

            Task.Factory.StartNew(() => { ProcessRequestContext(context); });


        }
    }

    private static void Main(string[] args)
    {
        Console.WriteLine("Starting http server");
        Task.Factory.StartNew(() => { listener(); });
        Console.WriteLine("Started the Listener");
        Thread.Sleep(-1);
    }

代码非常直接且简单,代码的目的是同时处理Http请求,它实际上可以在我的PC上运行,它具有i7-4790K处理器并运行Windows 10版本1709.

这是在浏览器中同时浏览链接“http://127.0.0.1:8080/”两次时的控制台输出:

Starting http server
Started the Listener
Started on http://127.0.0.1:8080/
New Context Process call
New Context Process call
Responded @ 06-Feb-18 3:40:45 PM
Responded @ 06-Feb-18 3:40:45 PM

这意味着两个请求已同时处理,因为两个响应同时发送。

然而,使用i5-6200U在我的笔记本电脑上运行完全相同的代码会产生惊人的不同结果

是:

Starting http server
Started the Listener
Started on http://127.0.0.1:8080/
New Context Process call
Responded @ 06-Feb-18 3:42:01 PM
New Context Process call
Responded @ 06-Feb-18 3:42:06 PM

这表明请求没有被同时处理,这在浏览器中显然也很明显,两个响应之间有5秒的延迟,即使这两个请求是同时发出的。

我也试过调查这个并发现我的笔记本电脑上的“http.GetContextAsync();”在我完成处理之前并关闭其流时,我不会给我新请求的上下文,而在我的PC上,只要浏览器发出新请求,它就会传递给我新的请求上下文。

我已成功使用“BeginGetContext / EndGetContext”在我的笔记本电脑上同时处理请求,但我想了解并知道为什么我写的代码在我的笔记本电脑上没有像在我的电脑上那样表现。

感谢。

0 个答案:

没有答案