C# HttpClient正在使用语句

C# HttpClient正在使用语句,c#,httpclient,C#,Httpclient,嗨,我读了这篇文章,文章建议 使您的HttpClient保持静态 除非您明确寻找特定行为(例如导致服务失败),否则不要将您的HttpClient丢弃或包装在using中 现在,像我这样的c#上的新手只需遵循它,就像文章中发布的代码是他说会使应用程序失败的原始代码一样 using System; using System.Net.Http; namespace ConsoleApplication { public class Program { public st

嗨,我读了这篇文章,文章建议

  • 使您的HttpClient保持静态
  • 除非您明确寻找特定行为(例如导致服务失败),否则不要将您的HttpClient丢弃或包装在using中
  • 现在,像我这样的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");
            }
        }
    }
    
    使用系统;
    使用System.Net.Http;
    命名空间控制台应用程序
    {
    公共课程
    {
    公共静态void Main(字符串[]args)
    {
    控制台写入线(“启动连接”);
    
    对于(int i=0;i而言,不同之处在于,在顶部循环中,您总共创建了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();
            }
        }
    }
    
    使用系统;
    使用System.Net.Http;
    命名空间控制台应用程序
    {
    公共课程
    {
    公共静态void Main(字符串[]args)
    {
    控制台写入线(“启动连接”);
    使用(var client=new HttpClient())
    {
    
    对于(int i=0;i向参考Microsoft文档添加答案:

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


    每次创建一个套接字时,它也会消耗有限的套接字资源。是的,这就是本文所说的,但我要问的是,在这种特定情况下,将for循环放入using语句与给定代码的for循环之间有什么区别?根本没有,因为静态对象的生存期与f主要内容()应用程序的方法。如果您正在执行一个事件驱动程序,如WinForms、WPF等,则公共静态字段/属性是在整个程序生命周期中共享此内容的一种不错的方式。我将发布该代码感谢您为我节省了时间是的,这就是我所说的。很遗憾,我没有注意到上面的静态变量将for循环放在
    using
    语句中,允许重用客户机,尽管在主方法的生命周期内不是静态的。
    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();
            }
        }
    }