Как ждать вызова 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
здесь - вы уже ждете результата.