Why is my async ASP.NET Web API controller blocking the main thread?

前端 未结 2 1019
庸人自扰
庸人自扰 2021-01-12 17:22

I have an ASP.NET Web API controller that I would have thought would operate asynchronously. The controller is designed to sleep 20 seconds for the first request, b

2条回答
  •  长情又很酷
    2021-01-12 18:00

    This actually has nothing to do with the server, and everything to do with the client. Both Chrome and Firefox don't appear to want to send what they deem a "duplicate" request until the first one has its response. A separate "private" session of either browser will return from the second request immediately. Internet Explorer 9 doesn't seem to exhibit this behaviour.

    To isolate from client implementations, I put together the following client.

    class Program
    {
        static void Main(string[] args)
        {
            var t1 = Task.Run(() => FetchData(1));
            var t2 = Task.Run(() => FetchData(2));
            var t3 = Task.Run(() => FetchData(3));
    
            var index = Task.WaitAny(t1, t2, t3);
            Console.WriteLine("Task {0} finished first", index + 1);
    
            Task.WaitAll(t1, t2, t3);
            Console.WriteLine("All tasks have finished");
    
            Console.WriteLine("Press any key");
            Console.ReadKey(true);
        }
    
        static void FetchData(int clientNumber)
        {
            var client = new WebClient();
            string data = client.DownloadString("http://localhost:61852/api/values");
            Console.WriteLine("Client {0} got data: {1}", clientNumber, data);
        }
    }
    

    It's output goes:

    1. Client 2 got data: "FOOBAR" (within milliseconds of startup)
    2. Client 3 got data: "FOOBAR"
    3. Task 2 finished first
    4. (long wait here)
    5. Client 1 got data: "FOOBAR"
    6. All tasks have finished

提交回复
热议问题