c#语法集之-----异步编程

本文介绍了C#中的异步编程概念,包括future(Task和Task<T>)以及异步操作的核心理念,强调了异步编程不会阻塞原始线程,并通过async和await关键字解释了如何实现异步方法。同时指出异步编程需谨慎使用,以避免并发问题。

异步(async 和await)

异步编程

并发的一种形式,它采用 future 模式或回调(callback)机制,以避免产生不必要的线程。

一个 future(或 promise)类型代表一些即将完成的操作。在 .NET 中,新版 future 类型
有 Task 和 Task 。在老式异步编程 API 中,采用回调或事件(event),而不是
future。异步编程的核心理念是异步操作:启动了的操作将会在一段时间后完成。这个操作
正在执行时,不会阻塞原来的线程。启动了这个操作的线程,可以继续执行其他任务。当
操作完成时,会通知它的future,或者调用回调函数,以便让程序知道操作已经结束。

异步操作是.net4.5推出的新名词,事实上,这东西早就有了,它归根结底是通过线程池来实现的,即将一个大任务分成多个小任何块,每个线程并行处理其中的一个,完成后再把结果告诉主线程,在.net4.5推出后,这种技术得到了封装,让开发人员实现起来更加方便了,但是,并发(异步,多线程)并不是在哪里都适用的,使用不当,可能出现很多严重的后果!

使用异步编程,方法调用是在后台执行(通常在线程的帮助下),并且不会阻塞调用线程。

await 关键字会解除线程(这里是UI线程)的阻塞,完成其他任务。当其方法完成其后台处理后,UI线程就可以继续,从后台线程中获得结果。
async 关键字创建了一个状态机,类似yieId return语句。
async修饰符只能用于返回Task或void的方法。

  1. async 标识一个方法为异步方法,可以与主线程并行执行,发挥CPU的多核优势
  2. await 在调用一个async方法前可以添加这个修饰符,它意思是等待当前异步方法执行完后,再执行下面的代码

代码:

class Program
    {
        static void Main(string[] args)
        {
            //当前线程(因为词句代码放在哪个线程代码模块下执行就表示哪个线程进行休眠)开始休眠指定的时间。
            Console.WriteLine("Main currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
            DoSomething();
            Console.WriteLine("Main currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);

            Console.ReadKey(true);
        }
        /// <summary>
        /// 代码实现中如果是异步,那么此方法名就需要(标记)成异步方法,即加上:aysnc修饰词
        /// </summary>
        private async static void DoSomething()
        {
            //耗时操作有:IO/Web跳转等操作。
            Console.WriteLine("耗时操作开始 currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
            //使用await关键字,在Task.Run方法完成前,当前方法内的其他代码不会继续执行,但是,启动DoSomething方法的线程可以被重新,该线程没有被阻塞。
            await Task.Run(() =>
            {
                Console.WriteLine("延迟3秒进行中 currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(3000);
            });//委托方法
            Console.WriteLine("耗时操作结束 currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
        }
  }

结果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值