演示C#里的async和await的使用

写了段小代码,给同事演示一下这2个语法糖的代码执行顺序:

class Program
    {
        static void Main()
        {
            Msg("Begin");
            DisplayValue();
            Msg("End");
            Console.Read();
        }

        #region async 测试
        public static async Task<double> GetValueAsync(double num1, double num2)
        {
            Msg("Into  GetValueAsync");
            var ret = await Task.Run(() =>
            {
                Msg("Into  GetValueAsync Task");
                for (int i = 0; i < 1000000; i++)
                    num1 = num1 / num2;
                Msg("out  GetValueAsync Task");
                return num1;
            });
            Msg("out  GetValueAsync");
            return ret;
        }
        public static async void DisplayValue()
        {
            Msg("Into  DisplayValue");
            var result = GetValueAsync(1234.5, 1.01);
            Msg("Middle  DisplayValue");
            Msg("Value is : " + await result);
            Msg("Out  DisplayValue");
        }
        #endregion

        private static int idx;
        static void Msg(string msg)
        {
            Interlocked.Increment(ref idx);
            var id = Thread.CurrentThread.ManagedThreadId.ToString();
            Console.WriteLine(idx.ToString() + ". 线程:" + id + "  " + msg);
            Thread.Sleep(100); // 避免cpu不定,导致顺序打乱
        }
    }

代码执行结果:

1. 线程:1  Begin
2. 线程:1  Into  DisplayValue
3. 线程:1  Into  GetValueAsync
4. 线程:1  Middle  DisplayValue
5. 线程:3  Into  GetValueAsync Task
6. 线程:1  End
7. 线程:3  out  GetValueAsync Task
8. 线程:3  out  GetValueAsync
9. 线程:3  Value is : 2.47032822920623E-322
10. 线程:3  Out  DisplayValue

把GetValueAsync方法的async和await 移除

public static Task<double> GetValueAsync(double num1, double num2)
{
    Msg("Into  GetValueAsync");
    var ret = Task.Run(() =>
    {
        Msg("Into  GetValueAsync Task");
        for (int i = 0; i < 1000000; i++)
            num1 = num1 / num2;
        Msg("out  GetValueAsync Task");
        return num1;
    });
    Msg("out  GetValueAsync");
    return ret;
}

执行顺序就变了,结果如下:

1. 线程:1  Begin
2. 线程:1  Into  DisplayValue
3. 线程:1  Into  GetValueAsync
4. 线程:1  out  GetValueAsync
5. 线程:3  Into  GetValueAsync Task
6. 线程:1  Middle  DisplayValue
7. 线程:1  End
8. 线程:3  out  GetValueAsync Task
9. 线程:3  Value is : 2.47032822920623E-322
10. 线程:3  Out  DisplayValue

你看明白了吗?如果不明白,把上面的测试代码复制到你的项目里,改一改,运行一下吧,
简单总结一下:
- await指令调起线程执行异步方法和方法内后面的代码
- await指令会阻塞当前方法后面的代码,但是不会阻塞外部调用
- await必须搭配async使用,而async不一定需要有await

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C#async/await是用于处理异步操作的关键字。它们可以帮助开发者更方便地编写和管理异步代码。 首先,我们需要将带有异步操作的方法标记为async,这告诉编译器该方法包含异步代码。然后,我们可以使用await关键字来等待一个异步操作完成。 当遇到await关键字时,程序会暂停执行并等待异步操作完成。在等待期间,控制权会返回给调用者,这样可以避免阻塞线程。一旦异步操作完成,程序会继续执行await后面的代码。 使用async/await可以使异步代码更加易读和易于维护。它们能够简化回调函数和处理异步任务的代码。此外,它们还可以帮助我们处理异常,使得错误处理更加简单。 以下是一个示例,演示了如何使用async/await来调用一个异步方法: ```csharp async Task<string> DownloadDataAsync(string url) { HttpClient client = new HttpClient(); string data = await client.GetStringAsync(url); return data; } async Task Main() { string url = "https://example.com"; string result = await DownloadDataAsync(url); Console.WriteLine(result); } ``` 在上面的示例,DownloadDataAsync方法使用await关键字等待HttpClient的GetStringAsync方法完成。然后,它将获取的数据作为字符串返回。 在Main方法,我们通过await关键字等待DownloadDataAsync方法完成,并将结果打印到控制台。 这就是使用async/await处理异步操作的基本概念。希望能对你有所帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游北亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值