首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何等待HttpClient GetAsync调用直到它返回C#中的请求

如何等待HttpClient GetAsync调用直到它返回C#中的请求
EN

Stack Overflow用户
提问于 2018-01-07 18:53:44
回答 1查看 3.8K关注 0票数 2

我正试图通过HttpClient获取数据。数据大小不同,可以从几个字节到兆字节不等。我注意到我的应用程序存在很多次,甚至在它从GetAsync返回之前。我怎么能等到GetAsync完成它的调用?来自主应用程序:-

代码语言:javascript
运行
复制
        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;
        }
    }

注释和答复后的代码更新:

代码语言:javascript
运行
复制
     // 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;
            }

        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-07 21:17:37

由于方法是异步的,backup.DoSaveAsync()行只启动一个任务,而不等待结果,因此您可以在任务完成之前调用Console.ReadLine (并可能退出程序)。您应该返回Task而不是void --通常情况下,使用void异步方法是不好的设计,而年轻用户必须通过等待(如果从异步方法调用),或者通过.Wait()等待backup.DoSaveAsync()

此外,在GetData中出现错误时,您不会返回DoSaveAsync的任何错误--您可能想要处理这个错误,在当前代码中,您将打印“未能获得快照”,然后“备份已在SQL数据库中成功完成”。考虑不要在Console.ReadLine中使用GetData,并在DoSaveAsync中返回一个表示成功的任务

不需要在这里放置thread.sleep --你已经在等待结果了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48140488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档