首页 > 解决方案 > Httpclient优化提升性能

问题描述

我担心我的 HttpClient 重用。我有以下课程,这是一个与 asp.net 核心 swagger api 通信的 Xamarin 表单应用程序。我正在运行 .net 5 核心,它有一点延迟,但想知道他们是否可以做些什么来改善我对 httpclient 的处理?

我没有使用标准的.net 5 httpclient 吗?

public class TheHockeyLabMnHttpApi
{  
  readonly HttpClient httpClient;  
  public class MyAppApiClass
  {
   public MyAppApiClass()
   {
        httpClient = new HttpClient();
        httpClient.BaseAddress = new Uri(Constants.BaseUrl);
   }
   
   public async Task<List<Workout>> GetAllWorkouts()
   {
     List<Workout> _result = new List<Workout>();

    var uri = new Uri(string.Format(Constants.BaseUrl + 
    Constants.ApiSegmant + Constants.GetAllWorkouts, string.Empty));
    AddAuthenicationHeader();
    var response = await httpClient.GetAsync(uri);

    if (response.IsSuccessStatusCode)
    {
        var byteArray = await response.Content.ReadAsByteArrayAsync();

        var content = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
        _result = JsonConvert.DeserializeObject<List<Workout>>(content);
    }

    return _result.ToList();

  }
 }
}

例如,我会这样称呼我的 api

public partial class AcitivtyListPage : ContentPage
{
    TheHockeyLabMnHttpApi api;
 
public AcitivtyListPage()
{
 InitializeComponent();
 api = new TheHockeyLabMnHttpApi();
}

 public async void BindGrid()
 {
    Indicator = true;
    loadingXoomPageHome.BindingContext = this;
 
    workOutGridMain.ItemsSource = await api.GetAllWorkouts();
    workOutGridMain.RefreshData();
    Indicator = false;
 }
       
}

他们有什么我能做的来帮助改善这一点吗?从电话应用程序到通话的延迟也有几秒钟,但我认为这更多地与与 https 通信而不是与 api 域的纯文本通信有关。

标签: c#xamarin.forms

解决方案


提高性能是一个棘手的问题

但是,您可以进行一些优化,以消除一些最常见的问题。

  • 使用IHttpClientFactory它有很多效率,并在处理套接字和其他细节时解决了几个问题。
  • 不要将内容读取为字节,然后转换为字符串,然后对其进行反序列化。相反ReadAsStringAsync甚至更好,直接从流中反序列化。
  • 更好的是,使用Text.Json而不是Json.Net用于反序列化,并再次直接从流中反序列化

注意:如果有的话,第一个建议可能会给您带来最大的收益。

除此之外,您的请求花费的时间比预期的要多的原因有很多,但是如果您的手机、设计糟糕的应用程序或互联网速度慢,那么您对这段代码无能为力。


推荐阅读