Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在while循环中使用一次性设备的必要性_C#_.net_.net Core - Fatal编程技术网

C# 在while循环中使用一次性设备的必要性

C# 在while循环中使用一次性设备的必要性,c#,.net,.net-core,C#,.net,.net Core,这可能真的是个笑话,但我真的很想理解。我正在做一个控制台应用程序,它向Swapi(星球大战API)发出请求,并捕获API上可用的所有星际飞船。 当我点击他们的API()时,响应返回一个名为“next”的字段,该字段包含他们拥有的星际飞船的另一部分(API正在对每个请求进行分页) 我创建了一个类,它对它们的API执行第一个请求,反序列化对象,在一段时间内,我验证字段“next”是否为null,并使用字段“next”执行其余请求 这是我的密码 public class RequestToSwapiA

这可能真的是个笑话,但我真的很想理解。我正在做一个控制台应用程序,它向Swapi(星球大战API)发出请求,并捕获API上可用的所有星际飞船。 当我点击他们的API()时,响应返回一个名为“next”的字段,该字段包含他们拥有的星际飞船的另一部分(API正在对每个请求进行分页)

我创建了一个类,它对它们的API执行第一个请求,反序列化对象,在一段时间内,我验证字段“next”是否为null,并使用字段“next”执行其余请求

这是我的密码

public class RequestToSwapiApi : IRequestToSwapiApi
    {
        private string Json;

        private string ApiURL
        {
            get
            {
                return "https://swapi.co/api/starships/";
            }
        }

        public async Task<RootObject> ReturnTheStarShipModels()
        {
            var request = new HttpClient();
            this.Json = await request.GetStringAsync(this.ApiURL);
            var rootObject = JsonConvert.DeserializeObject<RootObject>(this.Json);

            while (rootObject.Next != null)
            {
                this.Json = await request.GetStringAsync(rootObject.Next);
                var newDeserializeObject = JsonConvert.DeserializeObject<RootObject>(this.Json);
                if (newDeserializeObject.Results != null)
                {
                    rootObject.Results.AddRange(newDeserializeObject.Results);
                }

                rootObject.Next = newDeserializeObject.Next;
            }

            return rootObject;
        }
    }
public类RequestToSwapiApi:IRequestToSwapiApi
{
私有字符串Json;
私有字符串APIRL
{
得到
{
返回“https://swapi.co/api/starships/";
}
}
公共异步任务返回StarshipModels()
{
var request=newhttpclient();
this.Json=await request.GetStringAsync(this.ApiURL);
var rootObject=JsonConvert.DeserializeObject(this.Json);
while(rootObject.Next!=null)
{
this.Json=await request.GetStringAsync(rootObject.Next);
var newDeserializeObject=JsonConvert.DeserializeObject(this.Json);
if(newDeserializeObject.Results!=null)
{
rootObject.Results.AddRange(newDeserializeObject.Results);
}
rootObject.Next=newDeserializeObject.Next;
}
返回根对象;
}
}

我知道如果我使用一段代码“使用HttpClient”,我将避免使用一次性的。但是,如果我像上面那样在循环中使用块代码“UsingHttpClient”,那么我创建的对象将是可重用的吗?或者它将被创建,并可在循环每次运行时使用?我这样做可能会导致性能问题?

回答特定问题:您不需要在while循环或整个请求方法中处理
HttpClient
。由于应用程序使用
HttpClient
执行对外部API的请求,因此只有在应用程序关闭时才需要处理
HttpClient

对于NETCore2.1及以上版本,有一个名为
HttpClientFactory
的有用抽象,它为您创建和管理
HttpClient
池。您只需在DI容器中注册即可:

public void ConfigureServices(IServiceCollection services)
{
    // Registering IHttpClientFactory
    services.AddHttpClient();
    // ...
}
…并在您的类中注入:

public class RequestToSwapiApi
{
    private readonly IHttpClientFactory _clientFactory;

    public RequestToSwapiApi(IHttpClientFactory httpClientFactory)
    {
        _clientFactory = clientFactory;
    }

    public async Task<RootObject> ReturnTheStarShipModels()
    {
        HttpClient client = _clientFactory.CreateClient();
        //...
公共类RequestToSwapiApi
{
私有只读IHttpClientFactory\u客户端工厂;
公共请求WAPIAPI(IHttpClientFactory httpClientFactory)
{
_clientFactory=clientFactory;
}
公共异步任务返回StarshipModels()
{
HttpClient客户端=_clientFactory.CreateClient();
//...
有关更多信息:


啊,HttpClient。虽然它是一次性的,但你真的不应该处理它。看看网页上的其他类似信息谢谢你的回复。我问这个问题,因为我读了这篇文章,我感到困惑,因为在每个例子中,他都在使用它(var client=new HttpClient())因此,我不明白问题背后的想法是,有经验的C#程序员看到一个实现了
IDisposable
的类,并且知道他们需要使用
将实例包装到
中。我不知道HttpClient为什么会违反这条规则。我怀疑设计预期是它会像SqlConnection实例一样使用,b但在界面发布后,他们意识到它工作得更好,管理起来更像一个singleton@Flydog57好的,是的,
IDisposable
必须被处理,但问题是什么时候。对于Web API,即在控制器方法中使用
HttpClient
HttpClient
应该只在服务关闭之前被调度down.@HeitorRibeiro for Net.Core 2.1及以上版本您可以使用
IHttpClientFactory
处理HttpClient。有关详细信息,请参阅本文: