有没有办法用 HttpClient API 响应强制任务?
Is there a way to force Task with HttpClient API response?
我有一个任务想从构造函数中调用 class 但是执行起来真的很慢。有没有办法强制执行此任务?
private async Task GetExchange()
{
NewsStack.IsVisible = false;
SearchStack.IsVisible = false;
ExchangeStack.IsVisible = true;
try
{
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://coinlore-cryptocurrency.p.rapidapi.com/api/tickers/?start=0&limit=100"),
Headers =
{
{ "x-rapidapi-host", "coinlore-cryptocurrency.p.rapidapi.com" },
{ "x-rapidapi-key", "yourAPIkey" },
},
};
using (var response = await client.SendAsync(request))
{
var exchange = new Exchange();
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
var exchangeBody = JsonConvert.DeserializeObject<Exchange>(body);
exchange = exchangeBody;
this.exchangeBodyList = new List<SearchCrypto>();
foreach (var item in exchange.CryptoExchange)
{
this.exchangeBodyList.Add(new SearchCrypto()
{
Name = item.Name,
Symbol = item.Symbol
});
}
this.exchangeTest = exchange;
lstExchange.ItemsSource = exchangeBody.CryptoExchange;
}
dateTimeRefresh.Text = "Last Update: " + DateTime.Now.ToString("HH:mm:ss");
}
catch (Exception ex)
{
await DisplayAlert("Alert", "Please, check your internet connection.", "OK");
}
}
我在构造函数中这样调用这个任务:
Task.Run(() => this.GetExchange()).Wait();
我不确定是否有办法以另一种方式强制它。
我也接受代码优化的提示或示例。
您试图通过强制完成 API 调用来达到什么目的?就像大多数事情一样,服务器会在执行完所有操作后给出响应,而不是之前。早日强制结果的唯一方法是关闭连接而不是等待答案。如果您只是想让它加速并更快地完成,那么您需要加速服务器端代码和任何数据库调用。
就像在任何程序中一样,无法强制代码 运行 更快。您无法让计算机 运行 更快。您可以强制它在 higher priority 处成为 运行 一个线程,但我很确定这不会产生太大的速度差异,而且它可能不是您需要 运行 代码的格式英寸
加速代码不是这里的主题,除非您有实际的、特定的错误或问题要修复,但一般的“加速我的代码”在这里不起作用。它可能是关于 Code Review 的主题,也许,但不是这里。
一般来说,异步工作不适合构造函数。理想情况下,构造函数应该简短而快速并且几乎什么都不做 - 设置一些成员变量,也许做一些参数验证,仅此而已。
与其尝试将 I/O 塞进构造函数,不如考虑使用工厂模式。所以你创建了一个工厂,然后它可以使用像 async Task<MyType> CreateAsync()
这样的异步方法创建你想要的类型的实例。 CreateAsync
然后可以自然地(即异步地)调用 GetExchange
并将 exchangeBodyList
和 exchangeTest
传递给构造函数。
我有一个任务想从构造函数中调用 class 但是执行起来真的很慢。有没有办法强制执行此任务?
private async Task GetExchange()
{
NewsStack.IsVisible = false;
SearchStack.IsVisible = false;
ExchangeStack.IsVisible = true;
try
{
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://coinlore-cryptocurrency.p.rapidapi.com/api/tickers/?start=0&limit=100"),
Headers =
{
{ "x-rapidapi-host", "coinlore-cryptocurrency.p.rapidapi.com" },
{ "x-rapidapi-key", "yourAPIkey" },
},
};
using (var response = await client.SendAsync(request))
{
var exchange = new Exchange();
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
var exchangeBody = JsonConvert.DeserializeObject<Exchange>(body);
exchange = exchangeBody;
this.exchangeBodyList = new List<SearchCrypto>();
foreach (var item in exchange.CryptoExchange)
{
this.exchangeBodyList.Add(new SearchCrypto()
{
Name = item.Name,
Symbol = item.Symbol
});
}
this.exchangeTest = exchange;
lstExchange.ItemsSource = exchangeBody.CryptoExchange;
}
dateTimeRefresh.Text = "Last Update: " + DateTime.Now.ToString("HH:mm:ss");
}
catch (Exception ex)
{
await DisplayAlert("Alert", "Please, check your internet connection.", "OK");
}
}
我在构造函数中这样调用这个任务:
Task.Run(() => this.GetExchange()).Wait();
我不确定是否有办法以另一种方式强制它。
我也接受代码优化的提示或示例。
您试图通过强制完成 API 调用来达到什么目的?就像大多数事情一样,服务器会在执行完所有操作后给出响应,而不是之前。早日强制结果的唯一方法是关闭连接而不是等待答案。如果您只是想让它加速并更快地完成,那么您需要加速服务器端代码和任何数据库调用。
就像在任何程序中一样,无法强制代码 运行 更快。您无法让计算机 运行 更快。您可以强制它在 higher priority 处成为 运行 一个线程,但我很确定这不会产生太大的速度差异,而且它可能不是您需要 运行 代码的格式英寸
加速代码不是这里的主题,除非您有实际的、特定的错误或问题要修复,但一般的“加速我的代码”在这里不起作用。它可能是关于 Code Review 的主题,也许,但不是这里。
一般来说,异步工作不适合构造函数。理想情况下,构造函数应该简短而快速并且几乎什么都不做 - 设置一些成员变量,也许做一些参数验证,仅此而已。
与其尝试将 I/O 塞进构造函数,不如考虑使用工厂模式。所以你创建了一个工厂,然后它可以使用像 async Task<MyType> CreateAsync()
这样的异步方法创建你想要的类型的实例。 CreateAsync
然后可以自然地(即异步地)调用 GetExchange
并将 exchangeBodyList
和 exchangeTest
传递给构造函数。