es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna manera de forzar una respuesta de una tarea utilizando la API de HttpClient?

Tengo una tarea que quiero llamar desde la clase del constructor pero se ejecuta muy lento. ¿Hay alguna manera de forzar esta tarea?

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 = "Última actualización: " + DateTime.Now.ToString("HH:mm:ss");
    }
    catch (Exception ex)
    {
        await DisplayAlert("Alerta", "Por favor, verifica tu conexión a internet.", "OK");
    }
}

Llamo a esta tarea en el constructor de esta manera:

Task.Run(() => this.GetExchange()).Wait();

No estoy seguro si hay alguna otra forma de forzarla.

También acepto recomendaciones o ejemplos para optimización del código.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, no se recomienda llamar a métodos asíncronos desde un constructor, ya que los constructores idealmente deben ser ligeros e inicializar el objeto sin realizar operaciones que consuman mucho tiempo. Lo ideal es llamar al método “GetExchange()” después de que el objeto sea creado o inicializado.

    En segundo lugar, llamar a “Task.Run(() => this.GetExchange()).Wait();” bloqueará el hilo actual hasta que la tarea se complete, lo que puede ocasionar problemas de rendimiento si la tarea tarda mucho tiempo en completarse. En su lugar, deberías usar “await this.GetExchange();” para esperar de forma asíncrona a que la tarea se complete sin bloquear el hilo.

    Por último, una optimización que puedes hacer es reutilizar la instancia de “HttpClient” para múltiples solicitudes, ya que crear una nueva instancia para cada solicitud puede añadir una sobrecarga innecesaria. Puedes crear una instancia estática de “HttpClient” y reutilizarla en varias solicitudes.

    Ejemplo:

    public class MyClass {
       private static readonly HttpClient _httpClient = new HttpClient();
    
       public MyClass() {
          // inicializar objeto
       }
    
       public async Task DoStuff() {
          // realizar alguna otra tarea
          await GetExchange();
          // realizar alguna otra tarea
       }
    
       private async Task GetExchange() {
          // ... tu código existente
          using (var response = await _httpClient.SendAsync(request)) {
             // ... tu código existente
          }
          // ... tu código existente
       }
    }
    

Comments are closed.