c# - 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 域的纯文本通信有关。
解决方案
提高性能是一个棘手的问题
但是,您可以进行一些优化,以消除一些最常见的问题。
- 使用
IHttpClientFactory
它有很多效率,并在处理套接字和其他细节时解决了几个问题。 - 不要将内容读取为字节,然后转换为字符串,然后对其进行反序列化。相反
ReadAsStringAsync
甚至更好,直接从流中反序列化。 - 更好的是,使用
Text.Json
而不是Json.Net
用于反序列化,并再次直接从流中反序列化
注意:如果有的话,第一个建议可能会给您带来最大的收益。
除此之外,您的请求花费的时间比预期的要多的原因有很多,但是如果您的手机、设计糟糕的应用程序或互联网速度慢,那么您对这段代码无能为力。
推荐阅读
- typescript - 如何在 TypeScript 中实现一个可以用 new 关键字调用的函数?
- typescript - 无法解析**对象可能是“未定义”**
- elasticsearch - 将字段文本重新索引为日期会导致错误“拒绝将映射更新到...”
- typescript - 如何以角度 2 调用 wordpress 博客 api
- checkbox - 以编程方式取消选中 Vaadin 上下文菜单中的复选框
- python - 我可以通过同一类的静态方法访问和修改类属性
- aws-lambda - 从另一个 lambda 调用 lambda 中的特定事件
- visual-studio-code - 如何添加键绑定以在 VSCode 中打开特定的终端配置文件?
- java - 为什么我需要使用 WebDriver 而不是 ChromeDriver
- python - 如何使用 seaborn.relplot 绘制宽格式数据框