七:初探异步编程

同步编程

创建类

using System;
using System.Diagnostics;

namespace TestAsyncConsole
{
    public class NormalClass
    {
        Stopwatch sw = new Stopwatch();

        public void DoSomething()
        {
            const int largeNumber = 600000;
            sw.Start();
            int t1 = CountChar(1,largeNumber);
            int t2 = CountChar(2,largeNumber);
            LongProcess(largeNumber);
            LongProcess(largeNumber);
            LongProcess(largeNumber);
            Console.WriteLine("1: {0}",t1);
            Console.WriteLine("2: {0}",t2);
        }

        private int CountChar(int id,int Number)
        {
            int Total = 0;
            Console.WriteLine("开始调用{0} :{1,4} ms",id,sw.Elapsed.TotalMilliseconds);
            for (int i = 0; i < Number;i++ )
            {
                Total += i;
            }
            Console.WriteLine("结束调用{0} :{1,4} ms",id,sw.Elapsed.TotalMilliseconds);
            return Total;
        }

        private void LongProcess(int largeNumber)
        {
            for(int i=0;i<largeNumber;i++)
            {
            }
            Console.WriteLine("  时长: {0,4} 毫秒",sw.Elapsed.TotalMilliseconds);
        }
    }
}

调用该类

    class Program
    {
        static void Main(string[] args)
        {
            NormalClass normal = new NormalClass();
            normal.DoSomething();
            Console.ReadLine();
        }
    }
}

得到结果

异步编程

using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace TestAsyncConsole
{
    public class AsyncClass
    {
        Stopwatch sw = new Stopwatch();

        public void DoSomething()
        {
            const int largeNumber = 600000;
            sw.Start();
            var t1 = CountChar(1, largeNumber);
            var t2 = CountChar(2, largeNumber);
            LongProcess(largeNumber);
            LongProcess(largeNumber);
            LongProcess(largeNumber);
            Console.WriteLine("1: {0}", t1.Result);
            Console.WriteLine("2: {0}", t2.Result);
        }

        private async Task<int> CountChar(int id, int Number)
        {
            int Total = 0;
            Console.WriteLine("开始调用{0} :{1,4} ms", id, sw.Elapsed.TotalMilliseconds);
            Total = await Task.Run(()=>
                {
                    for (int i = 0; i < Number; i++)
                    {
                        Total += i;
                    }
                    return Total;
                }
                );
            Console.WriteLine("结束调用{0} :{1,4} ms", id, sw.Elapsed.TotalMilliseconds);
            return Total;
        }

        private void LongProcess(int largeNumber)
        {
            for (int i = 0; i < largeNumber; i++)
            {
            }
            Console.WriteLine("  时长: {0,4} 毫秒", sw.Elapsed.TotalMilliseconds);
        }
    }
}

调用该异步类得到的结果如下

可以看到虽然代码中LongProcess都在调用方法CountChar之后,但是实际执行的结果顺序却不是按照代码中的顺序。

总结异步同步编程的差异

  • 关键字只有两个Async和Await
  • Async和Await必须成对出现,否则就又会变成同步
  • Async用在异步方法的返回值修饰上
  • Await比较特殊,这里需要新建一个Task,也就是说必须是有一个新线程来处理异步
  • 异步的方法返回值和正常的返回值不同,正常的返回值是类型,而异步的返回值是Task<类型>
  • 获取结果的方法不是使用返回值,因为返回值的类型是Task<类型>,而是使用返回值.Result。其中这个Result的类型才是Task<类型>中的类型

原文地址:https://www.cnblogs.com/yuanhaowen/p/9884892.html

时间: 2024-08-01 04:44:41

七:初探异步编程的相关文章

Node 初探异步编程

从C/C++转过来最开始不适应的就是这个了吧.=-= Node是单线程,那么怎么提高效率?怎么解决一些阻塞问题?Node的基因里使用了异步IO,上次在http://www.cnblogs.com/zhangmingzhao/p/7564738.html 已经说到这个问题,Node的异步机制往往伴随着回调. 先看一个关于CPU的例子来比较同步和异步:  同步:CPU需要计算10个数据,每计算一个结果后,将其写入磁盘,等待写入成功后,再计算下一个数据,直到完成. 异步:CPU需要计算10个数据,每计

初探asp.net异步编程

终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 写在前面(带着问题学习) 一.根据代码和执行结果,初探异步编程的执行过程. *问题1:await会让当前线程一直等待吗? *问题2:等待await数据返回交给等待线程再继续向下执行吗? *问题3:向await下一条语句执行的线程,是执行await的线程吗? 二.异步编程async,await的使用意义和适用场景. *问题1:异步编程可以让程序变快吗? *问题2:异步编程执行耗时计算有用吗? *问题3:既

Boost.Asio基础(五) 异步编程初探

异步编程 本节深入讨论异步编程将遇到的若干问题.建议多次阅读,以便吃透这一节的内容,这一节是对整个boost.asio来说是非常重要的. 为什么需要异步 如前所述,通常同步编程要比异步编程更简单.同步编程下,我们很容易线性地对问题进行考量,函数A调用完,继续执行B,B执行完,继续执行C,以此类推,相对比较直观.而对于异步编程,假设有5个事件,我们很难知道它们具体的执行顺序,你甚至不知道,它到底会不会被执行. 虽然编写异步的程序,很难,但是依然需要使用这种方法.因为服务器程序需要同时并行的处理大量

【Node.js基础篇】(七)Node异步编程之事件发射器

事件发射器是Node里除了回调函数外的另一十分重要的异步编程技术. 在MFC等图形界面编程库中,事件发射器是非常常见的,比如,鼠标点击事件,点击了鼠标后,就会触发鼠标点击后的函数--事件发射器触发事件,并且在事件被触发后处理它们.在Node API组件中,如HTTP服务器.TCP服务器等都被做成了事件发射器,所以掌握事件发射器的编程方法,是非常重要的. 使用on添加监听器 步骤: 声明事件发射器类 创建事件发射器对象 使用on添加事件发射器 使用emit发射事件 //事件发射器类声明 var E

第二部分:异步编程初探与reactor模式

作者:[email protected]http://krondo.com/?p=1247  译者:杨晓伟(采用意译) 这个系列是从这里开始的,欢迎你再次来到这里来.现在我们可能要写一些代码.在开始之前,我们都做出一些必要的假设. 关于对你的假设 在展开讨论前,我假设你已经有过用Python写同步程序的经历并且至少知道一点有关Python的Sockt编程的经验.如果你从没有写过Socket程序,或许你可以去看看Socket模块的文档,尤其是后面的示例代码.如果你没有用过Python的话,那后面的

C#基础系列——异步编程初探:async和await

前言:前面有篇从应用层面上面介绍了下多线程的几种用法,有博友就说到了async, await等新语法.确实,没有异步的多线程是单调的.乏味的,async和await是出现在C#5.0之后,它的出现给了异步并行变成带来了很大的方便.异步编程涉及到的东西还是比较多,本篇还是先介绍下async和await的原理及简单实现. C#基础系列目录: C#基础系列——Linq to Xml读写xml C#基础系列——扩展方法的使用 C#基础系列——序列化效率比拼 C#基础系列——反射笔记 C#基础系列——At

Python Twisted网络编程框架与异步编程入门教程

原作出处:twisted-intro-cn 作者:Dave 译者:杨晓伟 luocheng likebeta 转载声明:版权归原作出处所有,转载只为让更多人看到这部优秀作品合集,如果侵权,请留言告知 感 谢:感谢 杨晓伟 luocheng likebeta 为国内Twisted Coder做的里程碑级贡献 其 它:能访问到Github的童鞋,请访问出处链接.因为出处排版相当棒! 1.Twisted理论基础 2.异步编程初探与reactor模式 3.初次认识Twisted 4.由twisted支持

异步编程系列第04章 编写Async方法

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而

异步编程系列第03章 自己写异步代码

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而