Как ждать вызова HttpClient GetAsync, пока он не вернет запрос в C#

Я пытаюсь получить данные с помощью HttpClient. Размер данных может варьироваться от нескольких байтов до мегабайта. Я много раз замечал, что мое приложение существует даже до его возвращения из GetAsync. Как я могу ждать, пока GetAsync завершит вызов? Из основного приложения:-

        backup.DoSaveAsync();
        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.BackgroundColor = ConsoleColor.Red;
        // My app exist by printing this msg, wihout getting any data. 
        // someitmes it gets data and other times it gets notinng.
        // I used sleep to wait to get the call completed. 
        Console.WriteLine("\nBackup has done successfully in SQL database")

        public async void DoSaveAsync()
        {
            using (var client = GetHttpClient(BaseAddress, path, ApiKey))
            {
                Stream snapshot = await  GetData(client, path);

                if (snapshot != Stream.Null)
                {
                    snapshot.Position = 0;
                    SaveSnapshot(snapshot);
                }
            }
        }

   private async Task<Stream> GetData(HttpClient client, string path)
    {
        HttpResponseMessage response = null;
        try
        {
            response = await client.GetAsync(path);
            System.Threading.Thread.Sleep(5000);
            if (response.IsSuccessStatusCode == false)
            {
                Console.WriteLine($"Failed to get snapshot");
                return Stream.Null;
            }
            return await response.Content.ReadAsStreamAsync();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return Stream.Null;
        }
    }

Обновление кода после комментариев и ответа:

     // in my main app, I have this code. 
     // How can I get the completed task or any error return by the task here.
    backup.DoBackupAsync().Wait();

    public async Task<Stream> DoSaveAsync()
    {
        using (var client = GetHttpClient(BaseAddress, SnapshotPath, ApiKey))
        {
            try
            {
                Stream snapshot = await GetSnapshot(client, SnapshotPath);

                if (snapshot != Stream.Null)
                {
                    snapshot.Position = 0;
                    SaveSnapshot(snapshot);
                }
                return snapshot;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }

        }
    }

1 ответ

Решение

Поскольку метод асинхронный, backup.DoSaveAsync() строка только запускает задачу, но не ждет результата, поэтому вы можете позвонить Console.ReadLine (и, возможно, выйдите из вашей программы) до завершения задачи. Вы должны вернуться Task вместо void - как правило, плохой дизайн - использовать асинхронный метод void, и вам нужно ждать backup.DoSaveAsync() либо через await (если вы вызываете из асинхронного метода), либо через .Wait(),

Также в случае ошибки в GetData, вы не вернете ошибку для DoSaveAsync - вы можете решить эту проблему: в текущем коде вы должны напечатать "Не удалось получить снимок", а затем "Резервное копирование успешно выполнено в базе данных SQL". Не используйте Console.ReadLine в GetData и вернуть задание в DoSaveAsync указывает на успех

Не нужно ставить thread.sleep здесь - вы уже ждете результата.

Другие вопросы по тегам