在线课程笔记—.NET基础

简介: 在线课程笔记—.NET基础

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。



679140-20161016202642983-2061599414.png



委托与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表达式:

679140-20161016202644936-1219071809.png

679140-20161016202647030-1310618459.png


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


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


  • 开发并行程序的关键在于找到一个合适的任务分解方案;


  • 并行总要付出一定的代价,比如线程同步,线程通信,同步缓冲数据等都是需要考虑的问题。


  • 需要仔细设计并行算法,并且应该在多个软硬件环境中测试。




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



多线程和串行程序的比较


679140-20161016202650639-1831234210.png


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



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


679140-20161016202653061-978335767.png


679140-20161016202700186-2040371982.png


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类型的委托,用于封装需要并行执行的功能代码;


679140-20161016202701670-1712974900.png


任务对象创建完毕之后,调用它的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.Result,以阻塞等待方式取回结果;


  • 使用Task.ContinueWith()方法,以回调方式取回结果;





目录
相关文章
|
3月前
|
JSON 开发框架 JavaScript
【Azure Developer】使用.Net Core解析JSON的笔记
【Azure Developer】使用.Net Core解析JSON的笔记
|
5月前
|
XML 机器学习/深度学习 移动开发
技术笔记:log4net使用详解
技术笔记:log4net使用详解
106 0
|
6月前
|
存储 SQL 开发框架
国产化之路 Linux Mono下的asp.net 开发笔记(三)
国产化之路 Linux Mono下的asp.net 开发笔记(三)
|
6月前
|
存储 SQL 开发框架
国产化之路 Linux Mono下的asp.net 开发笔记(二)
国产化之路 Linux Mono下的asp.net 开发笔记(二)
|
6月前
|
存储 开发框架 .NET
国产化之路 Linux Mono下的asp.net 开发笔记(一)
国产化之路 Linux Mono下的asp.net 开发笔记(一)
|
开发框架 .NET 数据库
ASP.NET Core 个人博客项目搭建笔记
简易个人博客项目搭建笔记 1.概述 项目梗概通过做一个比较简单,通俗易懂的个人博客项目,很简单的增删改查,来更好学习asp.net core,这个项目使用asp.net core webapi+elementui来做。 2.数据库设计文章表ID文章标题文章内容创建时间文章类型ID浏览量点赞量作者ID文章类型表ID类型名作者表ID姓名账号密码 MD5 3.架构设计仓储层服务层 MD5加密pu...
81 1
|
数据可视化 程序员 C#
使用Jupyter记事本记录和制作.NET可视化笔记
对于记录笔记的工具特别多,不过对于程序员来说,记录笔记+程序代码+运行结果演示可以同时存在,无疑会极大增加我们的笔记的可读性和体验感。以前在写python的时候,使用jupyter的体验很好,所以此处做一个基于jupyter的记录C#代码的笔记简易教程,供大家围观。
140 0
使用Jupyter记事本记录和制作.NET可视化笔记
C#编程-64:ADO.NET对象模型复习笔记
C#编程-64:ADO.NET对象模型复习笔记
C#编程-64:ADO.NET对象模型复习笔记
|
JSON 开发框架 前端开发
小范笔记:ASP.NET Core API基础知识与Axios前端提交数据
小范笔记:ASP.NET Core API基础知识与Axios前端提交数据
797 0
小范笔记:ASP.NET Core API基础知识与Axios前端提交数据
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
41 7

热门文章

最新文章

相关实验场景

更多