如何等待 HttpClient GetAsync 调用,直到它 returns C# 中的请求
How to wait for HttpClient GetAsync call until it returns the request in C#
我正在尝试通过 HttpClient 获取数据。数据大小不一,从几字节到几兆字节不等。我注意到很多次我的应用程序甚至在它 returns 来自 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;
}
}
}
由于该方法是异步的,backup.DoSaveAsync()
行只启动一个任务但不等待结果,因此您可以在任务之前调用 Console.ReadLine
(并可能退出您的程序)完成了。你应该 return Task
而不是 void
- 有一个 void 异步方法通常是糟糕的设计,你不必通过 await 等待 backup.DoSaveAsync()
(如果你从异步调用方法),或者通过 .Wait()
。
此外,如果 GetData
出现错误,您不会 return DoSaveAsync
出现任何错误 - 您可能需要处理此问题,在当前代码中,您会打印 "Failed to get snapshot" 然后 "Backup has done successfully in SQL database"。考虑不使用 GetData
中的 Console.ReadLine 和 DoSaveAsync
中的 return 表示成功的任务
无需在此处放置 thread.sleep
- 您已经在等待结果。
我正在尝试通过 HttpClient 获取数据。数据大小不一,从几字节到几兆字节不等。我注意到很多次我的应用程序甚至在它 returns 来自 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;
}
}
}
由于该方法是异步的,backup.DoSaveAsync()
行只启动一个任务但不等待结果,因此您可以在任务之前调用 Console.ReadLine
(并可能退出您的程序)完成了。你应该 return Task
而不是 void
- 有一个 void 异步方法通常是糟糕的设计,你不必通过 await 等待 backup.DoSaveAsync()
(如果你从异步调用方法),或者通过 .Wait()
。
此外,如果 GetData
出现错误,您不会 return DoSaveAsync
出现任何错误 - 您可能需要处理此问题,在当前代码中,您会打印 "Failed to get snapshot" 然后 "Backup has done successfully in SQL database"。考虑不使用 GetData
中的 Console.ReadLine 和 DoSaveAsync
中的 return 表示成功的任务
无需在此处放置 thread.sleep
- 您已经在等待结果。