当前位置: 首页 > 知识库问答 >
问题:

使用HttpClient GetAsync-非异步调用方法的C#Async/Await

侯沈义
2023-03-14
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace TestAsync
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("1. Calling process at {0:mm.ss.fff}", DateTime.Now);

            // Call 1
            Process();

            Console.WriteLine("1. Calling process at {0:mm.ss.fff}", DateTime.Now);

            // Call 2
            Process();

            Console.ReadKey();
        }

        private static void Process()
        {
            Console.WriteLine("2. Calling CallAsyncTest at {0:mm.ss.fff}", DateTime.Now);

            for (int i = 1; i < 4; i++)
            {
                // Try 1 - doesn't work
                //CallAsyncTest(i);

                // Try 2 - doesn't work
                //Task.Run(async () => await CallAsyncTest(i));

                // Try 3 - but works not recommended
                CallAsyncTest(i).Wait();

                // Try 4 - doesn't work
                //CallAsyncTest(i).ConfigureAwait(false); ;
            }
        }

        private static async Task CallAsyncTest(int i)
        {
            Console.WriteLine("{0}. Calling await AsyncTest.Start at {1:mm.ss.fff}", i + 2, DateTime.Now);

            var x = await AsyncTest.Start(i);
        }
    }

    public class AsyncTest
    {
        public static async Task<string> Start(int i)
        {
            Console.WriteLine("{0}. Calling await Post<string> at {1:mm.ss.fff}", i + 3, DateTime.Now);

            return await Post<string>(i);
        }

        private static async Task<T> Post<T>(int i)
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            using (HttpClient httpClient = new HttpClient(new HttpClientHandler()))
            {
                using (HttpResponseMessage response = await httpClient.GetAsync("https://www.google.com"))
                {
                    using (HttpContent content = response.Content)
                    {
                        string responseString = await content.ReadAsStringAsync();

            

        Console.WriteLine("response");
                }
            }

        }

        return default(T);
    }
}

共有1个答案

步兴德
2023-03-14

但这些是唯一真正使代码同步的版本

完全正确,你不应该仅仅因为这个原因而使用它。您不希望在执行I/O时锁定主线程,或者您的应用程序是最字面意义上的垃圾。

无论出于何种原因,如果您不想让整个应用程序异步,您仍然可以使用正确的异步模式。请记住,Await只不过是围绕task类提供的语法糖:一种在任务完成后继续的方法

 类似资料:
  • 我可能还不够清楚--情况是,我的现有代码不支持异步,我希望使用新的库,如System.net.http和只支持异步方法的AWS SDK。因此,我需要弥补这一差距,并能够拥有可以同步调用的代码,然后可以在其他地方调用异步方法。 我读了很多书,有很多次有人问这个问题,也有人回答这个问题。 从非异步方法调用异步方法

  • 没有await并且在非异步方法中调用异步方法的行为是什么?我这样问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,好像这是一件非常正常的事情。在这种情况下,异步方法的行为是否像是同步的?

  • 最早的的使用异步操作的时候,我们一般会用setTimeout,会出现回掉地狱的情况 setTimeout(()=>{ setTimeout(()=>{ setTimeout(()=>{ console.log('1') },1000) },1000) },1000) ES6中Promise //promise ()=>{ axios.post('/user/

  • 我(大部分)了解CompletableFuture的三种执行方法: 非异步(同步执行) 默认异步(使用默认执行器异步) 自定义异步(使用自定义执行器异步) 我的问题是:什么时候应该支持使用非异步方法? 如果您有一个调用其他方法的代码块,该代码块也返回CompletableFuture,会发生什么?表面上看,这可能很便宜,但如果这些方法也使用非异步调用,会发生什么?这难道不是一个很长的非异步块,可能

  • 同步调用异步方法最安全的方法是什么?