• 在线课程笔记—.NET基础


    关于学习北京理工大学金旭亮老师在线课程的笔记。

    介绍

    在线课程网址:http://mooc.study.163.com/university/BIT#/c

    老师个人网站:http://jinxuliang.com/MainWebSite

    10.10号开课的,主要有三个课程,其中我最想学习的就是老师最新的那个关于讲解ASP.NET Core的课程。现在推出来一章,昨天我学习了,很是受益(虽然我环境还没安装好,电脑配置是个伤呀)。对于想了解Core相关技术的同学来说很有帮助。(最起码有个参考的地方),其中后面还有关于依赖注入,IOC容器,AngularJS,DDD相关知识的讲解(高大上的知识呀)。据说老师的这个网站就是通过ASP.NET Core技术来创建的。

    dynamic类型

    在之前的项目中就经常使用这个类型,但是对于这个知识点不是很清楚。今天算是重新学习了。

    dynamic类型是动态类型,和我们常规的类型不一样,它是可以改变变量的值的特殊类型。就好比下面的代码一样。


    //dynamic是一种动态类型,可以在编译的时候直接改变变量中的值。而不是像常规的类型一样。不可以进行值的改变。
                  dynamic test = "test1";
                Console.WriteLine(test.GetType());
                test = 23;
                Console.WriteLine(test.GetType());            

    输出就是俩个不同的类型,在我们的ASP.NET MVC中的ViewBag就是使用的是dynamic类型;(想不到吧>)

    下面的例子是在此类型中添加委托方法。同样可以将方法输出。


                dynamic myBag = new ExpandoObject();
                myBag.intValue = 100;
                myBag.message = "hello";
                //声明委托方法,str相当与方法的参数。{}中的值就是方法体;
                Action<string> act = (str) => { Console.WriteLine(str); };
                //将方法赋值给say方法;
                myBag.say = act;
                Console.WriteLine(myBag.intValue*10);
                Console.WriteLine(myBag.message);
                myBag.say(myBag.intValue.ToString()); //方法参数为string类型
                 myBag.say(myBag.message);

    开始声明了ExpandoObject()对象;这个是在命名空间System.Dynamic中的,里面就一个方法,意思是表示一个对象,该对象包含可在运行时动态添加和移除的成员(包括属性和方法)方法是初始化不包含任何成员的新 ExpandoObject。

    image

    委托与Lambda表达式

    我们先看一些常规的委托是如何实现的。

    委托方法的使用:


          //1:声明委托
           public delegate string SomeDelegateType(int value);    
          class MyClass
          {
              //2:定义委托方法
              public string process(int value)
             {
                 return value.ToString();
             }
          }

              MyClass ob=new MyClass();
                //3:声明委托变量,且为其赋值方法。
                SomeDelegateType del = ob.process;
                //4:调用委托,这个del其实就相当于process()方法一样。
                Console.WriteLine(del(100));

    改造后的Lambda表达式:


        //1:声明委托
        public delegate string SomeDelegateType(int value);    
       SomeDelegateType del = (value) =>value.ToString();
       Console.WriteLine(del(100));

    比较:

    使用Lambda表达式可以不需要写那么多的代码,委托的实际方法不需要定义。不需要实例化变量。其实要是使用自带的委托类型还不需要定义委托;


                Func<int,string> del = (value) =>value.ToString();
                Console.WriteLine(del(100));

    了解Lambda表达式:

    image

    image

    任务并行库(TPL:Task Parallel Library)

    TPL是开发高性能.NET应用程序的利器,是.Net程序异步编程的基石。学习它可以更好的学习async/await异步编程模式;

    • 开发并行程序的关键在于找到一个合适的任务分解方案;
    • 并行总要付出一定的代价,比如线程同步,线程通信,同步缓冲数据等都是需要考虑的问题。
    • 需要仔细设计并行算法,并且应该在多个软硬件环境中测试。

    .NET平台中的并行计算组件

    多线程和串行程序的比较

    image

    思考一下,为什么会出现多线程编程,主要是合理的理由计算机CPU的资源,不让其闲下来,在有限的时间内处理更多的事情,提高资源利用率。

       提升抽象层次是降低软件开发难度,提高软件开发效率的有效方法;

    image


    image 

    Parallel开发并行计算程序

    Paraller内置三种典型的代码执行法式

    • Parallel.Invoke();并行执行方式;
    • Parallel.For();并行循环;
    • Parallel.ForEach();并行迭代;

    这个Parallel是依赖于底层的Task类完成工作的。Task类的一个实例,代表一个可以被执行的工作任务,是“任务并行库”中的和兴类型;

    基于TPL开发并行计算程序,几乎所有的工作都围绕着Task而展开

    背景线程

    • 主线程结束之后背景线程才结束;
    • 异步调用是由线程迟中的线程负责执行的;
    • await语句不会阻塞调用者线程;
    • 同一个方法中的代码,以await为边界,被划分为两块(或者多块,取决于await语句有多少个),然后,会由线程池中的某个线程来负责执行它们。
    • async/await 实际上是一种语法糖,它的功能完全可以由TPL实现,也可以直接使用线程实现,使用async/await的好处是可以写出简洁的代码;

    async/await适合的场景
      多线程的桌面应用程序;
      服务端的I/O密集操作;

    并行计算任务的创建与启动

    1:可以直接通过new关键字创建一个Task对象,Task的构造函数接收一个Action类型的委托,用于封装需要并行执行的功能代码;

    image[4]

    任务对象创建完毕之后,调用它的Start()方法启动,此任务将被追加到线程池的任务列表中调度执行。

         t.Start();

    2:可以把Task对象的创建和运行结合在一起;

        Task t=Task.Factory.StartNew(
                      () =>{ 任务方法});

         Task s = Task.Run(()=>{});

    返回一个”用于延迟”的任务

    Task.Delay()方法返回一个Task对象,它主要用在有await/async的异步方法中,其特点是不会阻塞调用者线程;实际开发中这样使用这个

           await Task.Delay(5000);

    demo

            private static void UseTask()
            {
                Console.WriteLine("使用Task.Delay()方法拖慢程序运行速度");
                //通过委托来实例化函数,来操作异步;
                Task.Run(() =>
                {
                    for (int i = 1; i <=10; i++)
                    {
                        Console.WriteLine("{0}",i);
                        Task.Delay(500).Wait();                           //线程等待
                    }
                }).Wait();      
            }

    取回Task的运行结果

    • 使用传统的多线程编程技术,利用线程同步对象取回结果;
    • 使用Task<T>.Result,以阻塞等待方式取回结果;
    • 使用Task.ContinueWith()方法,以回调方式取回结果;
  • 相关阅读:
    spoj 104 Highways (最小生成树计数)
    bzoj 1912 巡逻(树直径)
    BZOJ 3534 重建
    BZOJ 3143 游走(高斯消元)
    在Windows下编译PyCaffe
    caffe的Matlab接口的使用方法
    NewRelic性能监控之APM
    MariaDB-10.x二进制包安装
    mongoDB-3.x Balancer Management
    mongoDB-3.x集群管理
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/5967594.html
Copyright © 2020-2023  润新知