HttpClient in using statement

本文关键字:statement using in HttpClient | 更新日期: 2023-09-27 18:14:32

你好,我读了这篇文章,你使用HttpClient是错误的,它是不稳定的你的软件文章是建议以下2

    设置HttpClient为静态
  1. 不要处理或包装你的HttpClient使用,除非你明确地寻找一个特定的行为(如导致你的服务失败)

现在像我这样的c#新手只会像文章中发布的代码一样遵循它这里是原始代码他说会使应用程序失败

using System;
using System.Net.Http;
namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Starting connections");
            for(int i = 0; i<10; i++)
            {
                using(var client = new HttpClient())
                {
                    var result = client.GetAsync("http://aspnetmonsters.com").Result;
                    Console.WriteLine(result.StatusCode);
                }
            }
            Console.WriteLine("Connections done");
        }
    }
}
为了解决这个问题,他给出了下面的代码:
using System;
using System.Net.Http;
namespace ConsoleApplication
{
    public class Program
    {
        private static HttpClient Client = new HttpClient();
        public static void Main(string[] args)
        {
            Console.WriteLine("Starting connections");
            for(int i = 0; i<10; i++)
            {
                var result = Client.GetAsync("http://aspnetmonsters.com").Result;
                Console.WriteLine(result.StatusCode);
            }
            Console.WriteLine("Connections done");
            Console.ReadLine();
        }
    }
}

现在像任何新手一样好奇,我想到了using语句中的for循环,效果会和后者一样吗?

thank you

HttpClient in using statement

不同之处在于,在顶部循环中,您创建了10个HttpClient对象,每个对象使用一次,然后处理每个对象,而在底部,您只创建了一个HttpClient并重用它。

本文的重点是,每次想要进行web服务调用时都创建一个新的HttpClient对象是非常低效的——而且完全没有必要。由于HttpClient不仅是可重用的,而且是线程安全的,首选的方法是创建一个HttpClient并重用它,直到您的程序完成http连接。

编辑

听起来你是在问为什么不这样:

using System;
using System.Net.Http;
namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Starting connections");
            using (var client = new HttpClient())
            {
                for(int i = 0; i<10; i++)
                {
                    var result = Client.GetAsync("http://aspnetmonsters.com").Result;
                    Console.WriteLine(result.StatusCode);
                }
            }
            Console.WriteLine("Connections done");
            Console.ReadLine();
        }
    }
}

在这个特定的例子中没有区别。重要的是,HttpClient被重用,直到每个请求都完成。在大多数实际的场景中,为HttpClient提供一个静态属性是实现这一目标的最有意义的方法。

他们说"不要使用"的原因是使用";using意味着你的HttpClient是一个方法中的局部变量,在大多数情况下,这不是你想要的。在这种特殊情况下,来自程序的每个http请求都发生在一个方法中,该方法只调用一次,因此该方法的本地变量是好的-您最终使用一个HttpClient,直到所有请求发生,然后被处置。

添加参考Microsoft文档的答案:

https://learn.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

HttpClient旨在实例化一次,并在整个应用程序的生命周期中重用。特别是在服务器应用程序中,为每个请求创建一个新的HttpClient实例将耗尽重载下可用的套接字数量。这将导致SocketException错误。