• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
xiaoyaovo
博客园    首页    新随笔    联系   管理    订阅  订阅
C# 异步编程 await 、async 用法

官方的解释看得头晕,看了几篇博客写了这篇学习笔记

什么是异步编程

逍遥现在有两件事,事情一(花费 50 分钟)、事情二(花费 10 分钟)
如果让逍遥一个人做,那么需要花费的时间就是 60 分钟
但是如果逍遥在做事情一的时候让另一个人帮逍遥做事情二,那么花费的时间就是50分钟

结合下面 代码,应该能理解些许

示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace TestDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 获取当前时间戳
            string begin = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString();
            // 记录当前线程 ID
            Console.WriteLine("Main " + "当前线程 ID :"+ Thread.CurrentThread.ManagedThreadId);
            // 调用 await
            DoSomething();
            // 以执行该方法的线程 Sleep() 5000ms 来模拟当前线程要做的事
            Thread.Sleep(5000);
            // 记录当前线程 ID
            Console.WriteLine("Main " + "当前线程 ID :" + Thread.CurrentThread.ManagedThreadId);
            // 获取结束时间戳
            string end = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString();
            // 花费时间
            int time = (int)(ulong.Parse(end) - ulong.Parse(begin));
            Console.WriteLine("使用 await 花费时间: " + time);

            Console.WriteLine("\n" + "============分割线=================" + "\n");

            // 获取当前时间戳
            begin = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString();
            // 记录当前线程 ID
            Console.WriteLine("Main " + "当前线程 ID :" + Thread.CurrentThread.ManagedThreadId);
            // 不调用 await
            DoSomethingNoAwait();
            // 以执行该方法的线程 Sleep() 5000ms 来模拟当前线程要做的事
            Thread.Sleep(5000);
            // 记录当前线程 ID
            Console.WriteLine("Main " + "当前线程 ID :" + Thread.CurrentThread.ManagedThreadId);
            // 获取结束时间戳
            end = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString();
            // 花费时间
            time = (int)(ulong.Parse(end) - ulong.Parse(begin));
            Console.WriteLine("不使用 await 花费时间: " + time);


            Console.WriteLine("\n" + "============分割线=================" + "\n");

            // 当 Task 需要返回值时
            Task<int[]> taskRes = init(1,10);
            // 真的结果需要使用 Task<T> 的引用 task 的属性 Result 来接收
            int[] res = taskRes.Result;
            // 打印
            Console.Write("res[] :");
            for (int i = 0; i < res.Length; i++)
            {
                Console.Write(res[i] + " ");
            }
        }

        static async void DoSomething()
        {
            Console.WriteLine("调用 DoSomething() ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);

            await Task.Run(() => {
                Console.WriteLine("await Task.Run(()) 开始 ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(3000);
                Console.WriteLine("await Task.Run(()) 结束 ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);

            });

            Console.WriteLine("结束 DoSomething() ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
        }


        static void DoSomethingNoAwait()
        {
            Console.WriteLine("调用 DoSomethingNoAwait() ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(3000);
            Console.WriteLine("结束 DoSomethingNoAwait() ...currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
        }


        static async Task<int[]> init(int start,int end)
        {
            return await Task<int[]>.Run(() =>
            {
                int[] res = new int[end];
                for (int i = start; i < end; i++)
                {
                    res[i] = i;
                }
                return res;
            }
            );
        }
    }
}


结果如下
在这里插入图片描述

posted on 2022-08-05 13:38  豆本豆红枣豆奶  阅读(20)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3