HttpClient GetAsyn c занимает ~ 2 секунды - PullRequest
1 голос
/ 06 февраля 2020

Моя программа wpf читает команды из текстового файла, а затем отправляет эти команды через HttpClient. Каждый ответ GetAsyn c занимает около 2 секунд. Это кажется слишком длинным, особенно когда у меня есть 50 команд для отправки.

Является ли это нормальным периодом времени, когда HttpClient отправляет / получает сообщение GetAsyn c? Есть ли более быстрый способ сделать это?

static readonly HttpClient client = new HttpClient();
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Register_ClickAsync(object sender, RoutedEventArgs e)
        {

            int counter = 0;
            string line;

            System.IO.StreamReader file = new System.IO.StreamReader(@"C\path.txt");

            while ((line = file.ReadLine()) != null)
            {
                try
                {
                    var watch = Stopwatch.StartNew();
                    HttpResponseMessage response = await client.GetAsync(line);
                    response.EnsureSuccessStatusCode();
                    string responseBody = await response.Content.ReadAsStringAsync();

                    watch.Stop();
                    var elapsedMS = watch.ElapsedMilliseconds;
                    RequestTextBox.Text += "\n" + elapsedMS;

                }
                catch (HttpRequestException ex)
                {
                    Console.WriteLine("\nException Caught!");
                    Console.WriteLine("Message :{0} ", ex.Message);
                    this.RequestTextBox.Text += ("\n" + "Message: {0} ", ex.Message);
                }
            }
            file.Close();  
        }
    }

ОБНОВЛЕНИЕ: Это оригинальная программа. net Core WPF app. Я создал WPF-приложение. net с тем же кодом. Приложению Framework. net требуется 2000 мс для отправки первой команды HttpClient GetAsyn c, а затем <10 мс для последующих команд. Это значительное увеличение производительности. У кого-нибудь есть объяснение? Я не смог найти ни одной статьи, объясняющей это. </p>

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Ваш код ожидает каждого запроса.

Вы можете создать много задач, позвонив по номеру GetAsync, а затем ждать их всех с помощью Task.WhenAll(). Это будет быстрее.

0 голосов
/ 06 февраля 2020

Вы неправильно используете парадигму asyn c. Вы немедленно ожидаете асинхронный вызов c, и в результате он действует так же, как синхронный метод. Идея асинхронного c метода заключается в том, что он начинает работать и работает в фоновом режиме, не блокируя выполнение других потоков. Это позволяет вам запускать много потоков одновременно, а затем возвращать их, когда вы будете готовы их использовать. Я очень рекомендую msft docs в этом случае. Они используют пример приготовления завтрака, в этом примере они делают это неправильно, так как вы в своем вопросе:

Coffee cup = PourCoffee();
Console.WriteLine("coffee is ready");
Task<Egg> eggsTask = FryEggs(2);
Egg eggs = await eggsTask;
Console.WriteLine("eggs are ready");
Task<Bacon> baconTask = FryBacon(3);
Bacon bacon = await baconTask;
Console.WriteLine("bacon is ready");
Task<Toast> toastTask = ToastBread(2);
Toast toast = await toastTask;
ApplyButter(toast);
ApplyJam(toast);
Console.WriteLine("toast is ready");
Juice oj = PourOJ();
Console.WriteLine("oj is ready");

Console.WriteLine("Breakfast is ready!");

Чтобы исправить это, вы должны вызвать Task.WhenAny () или Task.WhenAll () , Это позволяет вам запускать все задачи сразу и возвращать их после того, как они закончатся (или когда они завершатся sh). Это значительно улучшит вашу производительность.

static async Task Main(string[] args)
{
    Coffee cup = PourCoffee();
    Console.WriteLine("coffee is ready");
    var eggsTask = FryEggsAsync(2);
    var baconTask = FryBaconAsync(3);
    var toastTask = MakeToastWithButterAndJamAsync(2);

    var allTasks = new List<Task>{eggsTask, baconTask, toastTask};
    while (allTasks.Any())
    {
        Task finished = await Task.WhenAny(allTasks);
        if (finished == eggsTask)
        {
            Console.WriteLine("eggs are ready");
        }
        else if (finished == baconTask)
        {
            Console.WriteLine("bacon is ready");
        }
        else if (finished == toastTask)
        {
            Console.WriteLine("toast is ready");
        }
        allTasks.Remove(finished);
    }
    Juice oj = PourOJ();
    Console.WriteLine("oj is ready");
    Console.WriteLine("Breakfast is ready!");

    async Task<Toast> MakeToastWithButterAndJamAsync(int number)
    {
        var toast = await ToastBreadAsync(number);
        ApplyButter(toast);
        ApplyJam(toast);
        return toast;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...