有没有办法用 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 并将 exchangeBodyListexchangeTest 传递给构造函数。