1、C#的执行是同步的
2、JavaScript的执行是异步的
3、C#多线程的使用需注意多线程的同步
4、有数据的存储就涉及到数据的检索(例如:C#集合(Collection);数据库)
5、同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。委托的同步调用通过Invoke方法来实现(C#)
6、异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。委托的异步调用通过BeginInvoke和EndInvoke来实现(C#)
7、委托(Delegate)特别用于实现事件和回调方法。就是叫别人帮你做事
8、.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
9、C#获取应用进程的线程数
1)打开任务管理器,查看---选择列----线程计数 勾起来后,就可以查看到每个程序的线程数了
2)
using System.Diagnostics;Process.GetCurrentProcess().Threads.Count;
3)
int n = 0;foreach (System.Diagnostics.ProcessThread th in System.Diagnostics.Process.GetCurrentProcess().Threads) { if (th.ThreadState == System.Diagnostics.ThreadState.Running) { n++; }}
10、C#中实现异步调用流程:
1)、创建一个异步处理函数,并针对其定义一个委托;
2)、在调用函数的时候,使用委托的BeginInvoke方法,指定在函数处理完成时的回调函数(如果不需要对完成事件做处理,可以给null值),并指定所需的参数(如果没有参数,也可以给null值);
3)、在回调函数中处理完成事件。
注:EndInvoke会使得调用线程阻塞,直到异步函数处理完成。显然,紧接在BeginInvoke后面的EndInvoke使用方式与同步调用等价。
.NET处理异步函数调用,事实上是通过线程来完成的。这个过程有以下几个特点:
- 异步函数由线程完成,这个线程是.NET线程池中的线程
- 通常情况下,.NET线程池拥有500个线程(当然这个数量可以设置),每当调用BeginInvoke开始异步处理时,异步处理函数就由线程池中的某个线程负责执行,而用户无法控制具体是由哪个线程负责执行
- 由于线程池中线程数量有限,因此当池中线程被完全占用时,新的调用请求将使函数不得不等待空余线程的出现。此时,程序的效率会有所影响
学习博文《》
11、领域驱动设计(DDD)
12、CQRS模式:命令查询职责分离模式
13、C#中异步调用和多线程的相同点和异同点
相同点:异步调用和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。
异同点:
1)异步和多线程的区别之异步调用的本质
所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。所以即使在DOS 这样的单进程(而且无线程概念)系统中也同样可以发起异步的DMA操作。
2)异步和多线程的区别之线程的本质
线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。
13、C#接口
1)、从接口的定义方面来说,接口其实就是类和类之间的一种协定,一种约束。
2)、从设计的角度来看:一个项目中用若干个类需要去编写,由于这些类比较复杂,工作量比较大,这样每个类就需要占用一个工作人员进行编写。比如A程序员去定Dog类,B程序员去写Cat类。这两个类本来没什么联系的,可是由于用户需要他们都实现一个关于”叫”的方法。这就要对他们进行一种约束。让他们都继承于IBark接口,目的是方便统一管理。另一个是方便调用。
......