【问题标题】:Is there a way to force Task with HttpClient API response?有没有办法通过 HttpClient API 响应强制任务?
【发布时间】:2022-01-23 03:53:14
【问题描述】:

我有一个任务想从构造函数类调用,但执行起来真的很慢。有没有办法强制执行此任务?

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 凭证,请立即获取新凭证。你永远不想发布这些信息。
  • 我更新了问题。
  • @BenJohnson,它仍在公开可见的编辑历史中,所以你仍然需要获得新的信誉。
  • 强制什么?为什么慢?是你的服务器吗?互联网连接?客户端的处理时间?除非您知道流程的哪个特定部分很慢,否则您无法修复“慢”。此外,从构造函数调用异步代码也不是一个好主意。您可以通过多种替代方法来执行此操作 - 例如,在页面中使用 async OnAppearing 调用。

标签: c# http xamarin async-await httpclient


【解决方案1】:

一般来说,异步工作不适合构造函数。理想情况下,构造函数应该短而快,几乎什么都不做——设置一些成员变量,也许做一些参数验证,仅此而已。

与其尝试将 I/O 塞入构造函数,不如考虑使用工厂模式。所以你创建了一个工厂,然后它可以使用像async Task&lt;MyType&gt; CreateAsync() 这样的异步方法来创建你想要的类型的实例。然后CreateAsync 可以自然地(即异步)调用GetExchange 并将exchangeBodyListexchangeTest 传递给构造函数。

【讨论】:

    【解决方案2】:

    您想通过强制完成 API 调用来达到什么目的?就像大多数事情一样,服务器会在执行所有操作时给出响应,而不是之前。尽早强制结果的唯一方法是关闭连接而不是等待答案。如果您只是想让它加速并更快完成,那么您需要加快服务器端代码和任何数据库调用。

    就像在任何程序中一样,没有办法强制代码运行得更快。你不能让计算机运行得更快。您可以强制它在 higher priority 处运行线程,但我很确定这不会产生太大的速度差异,而且它可能不是您需要运行代码的格式。

    加速代码在这里并不是真正的主题,除非您有一个实际的、特定的错误或要修复的问题,但是一般的“加速我的代码”在这里不起作用。可能是Code Review 的主题,也许,但不是这里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多