D-20 非同步 ? async ? await

如何同时进行

昨天的日子中小光学到了如何使用delegateLinq,这让小光在资料处理中的程序开发大大进步,不过在资料量大时执行速度就显得缓慢,所以小光就把这问题拿来请教大头,看看大头有什麽解法。

本文同步放置於此

非同步程序开发

「前辈,我昨天学到delegateLinq之後立刻回家试验,果真可以把语法写得好简洁唷,不过有遇到执行速度很慢的问题耶」
听到这个,大头跟以往的埋头苦干不一样,这时立刻抬起头来不解地看着小光这样子问。
「你的资料到底是多大啊,大到执行速度很慢。照理来说几千几万笔资料的Linq在现在电脑来说应该不会慢才对,不过超过的话就不敢肯定了。」
听完大头这麽说,小光陷入了沈思之中,努力地思索自己到底写了什麽,过了一阵子後小光才这麽说。
「会不会我写了一堆判断式跟一堆程序逻辑在Linq内。」
听完小光的说明後大头点点头,并且这样说。
「有可能喔,因为简洁所以通常会有人写的包山包海,这样会造成执行速度不彰,除此之外也要慎选资料结构喔如果有唯一Key时需要用Dictionary这样可以改善效能不彰的状况。」
讲完之後换大头陷入沈思之中,待过了几分钟後大头这样子说。
「不过如果真的需要处理的东西太多时,那就要考虑使用非同步程序设计。」
听到这个小光眼睛又亮了起来。

Thread

要介绍非同步程序设计就不能不提到执行序这概念,执行序就是作业系统透过CPU在原来的程序中产生一条平行的线程,并在那线程处理资料,然後C#的Thread就是利用作业系统的执行序来处理资料,然後这边不多做说明,因为OS层级的操作,所以成本耗费较多,再来是无法有回传值以及无法取消等因素所以使用上有诸多限制,因此今天只介绍常用的Task

Task

关於Task的用法有两种,其中比较旧的写法是透过Task.Factory.StartNew来产生一个新的Task,但是Task.Factory.StartNew中建议除非需要,否则建议直接使用Task.Run,所以接下来请大家看一下以下范例。

Console.WriteLine("Main Start Step1");
Task.Run(() =>
{
    Console.WriteLine("Task Start Step2");
});
Console.WriteLine("Main End Step3");

上述例子的结果如何呢,Task.Run内的方法在最後一个执行完才接着执行,所以结果如下所示。

Main Start Step1
Main End Step1
Task Start Step2

不过这样写又多了很多赘词,而且阅读上不是那麽清楚,所以最後要介绍语法糖asyncawait

async await

在非同步程序设计中最後要介绍的是asyncawait,其实这两个东西跟之前所说的Task没有冲突,只不过是为了让程序语法写得更简洁而已,所以接下来我们看看要怎麽写。

        public async Task Print(string msg)
        {
            Console.WriteLine(msg);
        }

        public async Task DoPrint()
        {
            await Task.Delay(TimeSpan.FromSeconds(1));
            await Print("This is message");
        }

        public async Task DoNotWait()
        {
            Print("This is begin");
            DoPrint();
            await Task.Delay(TimeSpan.FromSeconds(1));
            await Print("This is end");
            Console.WriteLine("This is finish");
        }

为了要凸显程序跑的时间序所以在例子中做了一些Task.Delay的等待,简单说明一下就是在方法上宣告async代表这个方法是非同步的方法,而是否要等待就取决於呼叫该方法时有没有加上await的修饰词。
所以上述的结果会如下内容所示。

This is begin
This is end
This is finish
This is message

後记

「前辈学了非同步程序开发後让我对於程序开发有多一些认识,但是我觉得头好晕啊。」
在听完大头的介绍之後小光这麽说,然後大头听完小光的感想後哈哈大笑并且这麽说。
「哈哈哈,没关系啦这是程序设计的必经之路,遇到不懂後把他搞懂,接下来要跟你开始介绍网页程序开发罗,敬请期待唷。」


<<:  分类模型哪个好?confusion matrix/sensitivity/ specificity

>>:  Day23-pytorch(6)iris资料集示范classifier模型pytorch完整训练过程

30天零负担轻松学会制作APP介面及设计【DAY 23】

大家好,我是YIYI,今天要来分享我设计的APP的PHOTOTYPE制做过程。 今日进度 今天的进度...

Cobol Picture Clause/cobol field type

常看到,却老搞不清楚,这次很幸运,google到说明与live demo. Cobol Pictur...

# Day 25 Heterogeneous Memory Management (HMM) (Summary)

文件 原文文件:Heterogeneous Memory Management (HMM) 摘要 这...

【I Love Vue 】 Day 27 爱荷华博弈任务(八) - 测验画面2

我们接着继续开发 测验区 的部分 测验区 先来看看画面: 可以看到测试区除了上面的总分之外,我们有四...

[day24]Vue实作-交易建立页面_完成版

调整 目前虽然可以送交易,但还没有解析回覆的结果,趁连假第一天来处理一下!! 解析订单送出後回覆之资...