SQL:
1 引用完整性(主表约束字表)
设置表间关联 ,添加表约束,设置外键 ,
设计-关系-表和列规范-添加表间键关系, 外键表:(操作的是需要设置外键的表),主键表:(主键被设置成外键的表)
内连接 inner join on
select a.productID as 产品编号,a.Name 产品名字,a.Producer 产商,b.Name as 类型名称,b.Remark 标语
from Production as a inner join ProductType as b on a.ProductTypeID=b.ProductTypeID
外连接:
左外连接 left (outer) join on 保证左边数据完整
右外连接 right(outer) join on 保证右边数据完整
C# 进程,多线程,同步,异步
计算机概念
进程:程序运行在服务器,占用计算机资源的合集
进程之间不会相互干扰-进程通信比较困难
线程:程序执行的最小单位,响应操作最小的执行流
线程也包含自己的计算资源,线程是属于进程的
一个进程可以有多个线程
多线程:一个进程有多个线程并发执行
C#
多线程Thread类,就是一个封装,是.NetFramework对线程对象的抽象封装
通过Thread去完成操作,最终是通过向操作系统得到执行流
currentThread:当前线程-任何操作都是线程完成的,运行当前这句话的线程
ManagedThreadID:.Net平台给Thread起的名字,就是int值
同步单线程方法:按顺序执行,每次调用完成才能进入下一行,是一个线程
异步多线程:离不开委托,发起调用,不等待结束就进入下一行(主线程)
动作会由新线程来执行(子线程),并发了;
1 同步单线程卡界面,主线程忙于计算,所以不能响应
异步多线程不卡界面,主线程已经闲置了,计算任务交给了子线程
cs:按钮后不卡死,上传文件不卡死;
bs:用户注册发邮件/发短信/写日志
2 同步单线程 只有一个线程计算
异步多线程快 多个线程并发计算
多线程就是用资源换性能
3 无序性-不可预测性
启动无序,几乎同一时间向操作系统请求线程 也是个cpu需要处理的请求
执行时间不确定,同一个线程同一个任务耗时也不相同
其实跟操作系统的调度策略有关,CPU分片(计算能力强,宏观上就是多并发了--线程优先级可以影响cpu调度)
4 结束无序
使用多线程时,不用通过延时等方式掌控顺序,也不要试图“风骚的多模式”掌控顺序
解决多线程的不可预测性
5不允许没有监控的项目上线,需要在业务操作后记录日志
异步回调方法;
Action.Invoke() 同调
Action.BeginInvoke() 异调
通过设置AsyncCallback委托类型callback 这个变量,设置参数类型为IAsyncResult类型
阻塞当前线程 :
IsCompleted 用来描述异步是否完成
虽然可以控制顺序,但是会出现界面卡死
信号量无延迟 awynacResult.AsyncWaitHandle.WaitOne();-1一直等待,1000,最多等待1000毫秒
阻塞当前线程,直到收到信号量从asynaResult发出,无延迟
1.0 Thread 的 API 特别丰富;
线程资源是操作系统管理的,响应并不灵敏
Thread启动线程没有控制,可能导致死机;
Thread就像给一个四岁小孩一把热武器,虽然威力很大但是造成破坏威力很大
2.0 ThreadPool 池化资源管理设计思想,线程是一种资源,之前每次要用线程,就去申请一个线程,使用之后就释放掉;池化就是一个容器,容器提前申请好,程序
需要线程,直接找容器获取,用完再放回容器,避免频繁的申请和销毁,容器还会根据限制的数量去申请和释放
线程复用,可以限制最大线程数量;
ThreadPool.QueueUserWorkItem(callback)
API太少,线程等待顺序控制特别弱;实战不方便
3.0 Task被称为多线程的最佳实践
1,Task线程全部是线程池 2,提供了丰富的API,非常适合开发实践
Task专题解析
多线程 API不难,难在恰如其分的使用
提高效率,这些任务可以独立并发的执行
//数据库查询10条数据需要10s,不能多线程优化
Task.WaitAll();阻塞当前线程,直到全部任务结束;
Task.WaitAny();阻塞当前线程,直到某一个完成,取消阻塞
1、 尽量不要线程套线程
TaskFactory.ContinnueWhenAll(,);
TaskFactory.ContinnueWhenAny(,);
continue的后续线程,可能是新线程,可能是完成任务的线程,可能是同一个线程,但是肯定不是主线程
线程是不可预测的;
Paralle 可以启动多线程,主线程也参与计算,节约一个线程
Paralle.invoke();
可以通过ParallelOptions控制最大并发数量
await async