zoukankan      html  css  js  c++  java
  • C# Async/Await

    前言    

        前几天去一个公司面试,被问到 Async/Await,之前只知道有这么个东西,没有深入了解过就没有答上来。今天没啥事情,就查了下资料。

    同步编程,异步编程概念

        通常情况下,我们写的程序是同步的,运行在同一个线程中,从程序的第一行代码到最后一句按照顺序执行。而异步编程的核心是使用多线程,通过让不同的线程执行不同的任务,从而实现异步编程。

    Thread & Task

       .NET 4.0推出了新一代的多线程模型Task。async/await特性是与Task紧密相关的,所以在了解async/await前必须充分了解Task的使用。

       Demo:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace DemoAsync
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Task   With Thread  Start !");
                for (int i = 0; i <= 5; i++)
                {
                    Thread t = new Thread(Dotaskfunction);
                    t.Start();
                }
                Console.WriteLine("Task   With Thread End !");
    
                Console.WriteLine("Task   With Task   Start !");
                for (int i = 0; i <= 5; i++)
                {
                    Task.Run(() => { Dotaskfunction(); });
                }
                Console.WriteLine("Task   With Task End !");
                Console.ReadLine();
    
            }
    
            public static void Dotaskfunction()
            {
                Console.WriteLine("task  has been done! ThreadID: {0},IsBackGround:{1} ", Thread.CurrentThread.ManagedThreadId,Thread .CurrentThread .IsBackground );
    
            }
    
        }
    }

    结果:

           可以看到Thread方法每次的Thread Id都是不同的,而Task方法的Thread Id是重复出现的。我们知道线程的创建和销毁是一个开销比较大的操作,Task每次执行将不会立即创建一个新线程,而是到CLR线程池查看是 否有空闲的线程,有的话就取一个线程处理这个请求,处理完请求后再把线程放回线程池,这个线程也不会立即撤销,而是设置为空闲状态,可供线程池再次调度, 从而减少开销。

    Async/Await

          其实也没有什么神秘的,个人觉得就是实现异步主要靠await ,假如一个声明为async的方法,没有使用await关键字,则这个方法在执行的时候就被当作同步方法,这时编译器也会抛出警告提示async修饰的方法中没有使用await,将被作为同步方法使用。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace DemoAsync
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Task Start !");
                //DotaskWithThread();
                DOTaskWithAsync();
                Console.WriteLine("Task End !");
                Console.ReadLine();
    
            }
    
            public static async void DOTaskWithAsync()
            {
    
                Console.WriteLine("Await Taskfunction Start");
                await Task.Run(()=> {
                    Dotaskfunction();
                    });
    
    
            }
            public static void Dotaskfunction()
                {
                for (int i = 0; i <= 5; i++) {
    
                    Console.WriteLine("task {0}  has been done!",i);
                }
             
                }
    
    
    
    
        }
    }

    输出:

    也看到很多人使用task过程中会用到Task的泛型形式,这个还没明白这样用有啥用。 感觉像Demo 中这样,我可以更好地理解,有人知道那个Task泛型使用的,可以留言讨论。

    参考: https://www.cnblogs.com/kim-meng/p/5019943.html

  • 相关阅读:
    iOS 动画 旋转 移动简单代码
    iOS 根据UIImage 修改UIImageView Frame (包括截取图片中间部分)
    Spark深入浅出
    Spark企业级开发最佳实践
    Spark架构案例鉴赏:Conviva、Yahoo!、优酷土豆、网易、腾讯、淘宝等公司的实际Spark案例
    Spark 1.0.0企业级开发动手:实战世界上第一个Spark 1.0.0课程,涵盖Spark 1.0.0所有的企业级开发技术
    Hadoop大数据时代:Hadoop&YarnSpark企业级最佳实践 (4天)
    Hadoop&Yarn&Mahout&Spark企业级最佳实践(3天)
    Conquer Big Data through Spark
    18小时内掌握Spark:把云计算大数据速度提高100倍以上!(Final版本)
  • 原文地址:https://www.cnblogs.com/huandong963/p/12593278.html
Copyright © 2011-2022 走看看