1.asyncrel = delegate.BeginInvoke实现委托异步调用。
2.异步等待 asyncrel.IsCompleted用于判断是否执行完毕 or EndInvoke用于等待执行完。
3.异步多线程(资源换时间)使用场景:1.任务比较多,需要提高效率,资源换时间 2.推迟执行,比如发送短信可以异步执行。
4.线程的特点:无序性,启动顺序不确定、执行时间不确定、结束时间不确定。
5.异步多线程均与委托相关。
6.委托.BeginInvoke与Thread.Start() 效果几乎类似,都能实现异步多线程。区别:Thread是前台线程,程序退出后,计算任务会继续执行完毕,构造函数对应的委托没有返回值,没有回调,也做不到,但是BeginInvoke的可以有返回值,也有回调。
7.线程池:享元模式的实现。也是一种资源换时间的方式,是单例的
8.写一个5秒炸弹例子,通过ManualResetEvent.
9.Task ,基于线程池。new TaskFactory().StartNew(Action act);Task t=new Task(Action act) t.Start;Task task=Task.Run(Action act);等价
10.Task.WaitAny();Task.WaitAll();卡住当前线程,等待异步线程执行完毕。
11.new TaskFactory().ContinueWhenAny() new TaskFactory().ContinueWhenAll() 实现线程结束后的回调函数。
12.Parallel并行计算。同时开启多个线程执行但是不是异步,底层还是通过Task实现。
    Parallel.Invoke(),Parallel.For
任务:通过Task封装一个Parallel
13.异常的处理:多线程的委托是不允许异常的,唯一的处理方式就是通过try catch去隐藏异常并写日志。因为多线程的异常如果不等待的话是无法抓取的,因为每一个线程有自己的内存空间,自己的执行流。
14.线程取消:通过CancellationTokenSource这个类实现简单的线程通讯,这个类就像是一个线程间的全局变量。通过设置类实例的属性进行识别是否要停止,线程不能主动取消,只能通过信号量让其自己终止自己。cts.Token可以与TaskFactory的参数结合使用,将cts.Token作为TaskFactory.startNew的参数传递后,没有启动的任务会放弃启动,框架自动帮我们做了判断。
new taskFactroy.StartNew(act,name,cts.Token);
15线程安全:多个线程同时访问同一个共享变量的时候容易触发。
解决方式:
1.锁。private static object o=new object();
在操作公共变量的时候
lock(o){
 
},多线程的任务排队进入,变成单线程。
2.数据隔离。解决线程冲突的根本办法。
14.async与await成对出现,被async修饰的方法内部都是有task等待的。如果方法只通过async修饰,仍然是同步的效果,只使用await会报错。
使用效果:
await task(委托);会一直等待多线程执行完毕,执行完毕后,主程序遇到await会直接返回,await后面的代码会被包装成一个Action作为一个回调来使用,不在占用主线程。
async修饰的方法为异步方法默认会返回一个Task,即使方法没有返回值。如果有返回值则返回一个Task<T>
外部调用方式:
private async Task<long> doSomeThing(){}
Task<long> t=doSomeThing();
long rel=t.Result;//会等待异步方法执行完毕
或者使用 t.Wait();
本质上还是异步多线程。
新语法:
        如果是一个async/await的方法,如果方法是没有返回值的,则可以写成返回值是Task的形式。
        private async void NoReturn=private async Task NoReturn。推荐后者,如果没有返回值类型,则返回一个Task,方法其他方法调用时进行wait。
返回值:
        如果没有返回值,则应该返回一个Task,如果返回一个int类型的值,则应该是Task<t>
        Task<int> t=SumAsync();
        int iRel=t.Result;//访问result,程序会一直等待计算该结果的线程结束 效果等价于t.Wait();
 
16.线程取消:通过CancellationTokenSource 的实例来完成。该类的实例是所有的线程都可以访问到的,程序可以通过调用.Cancel()方法将属性值IsCancellationRequested修改为true,其他线程的代码可以通过判断IsCancellationRequested属性来觉得是否要继续执行。说白了就是一个全局与所有线程的一个变量。
17.拿到线程的异常:把所有的多线程都放到一个TaskList里面,然后调用WaitAll的时候就可以全部拿到Task.WaitAll(taskList.ToArray());异常的类型:AggregateException。不等待的情况下,多线程的Action(委托)是不允许异常的,方法就是try catch掉,并在catch里写日志。
 
 

c#异步多线程的更多相关文章

  1. 初学Python之异步多线程:sockserver

    异步多线程:服务端 import socketserver class MyServer(socketserver.BaseRequestHandler): def setup(self): pass ...

  2. .NET 异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消

    今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...

  3. 异步多线程 Async

    进程:进程是一个程序在电脑运行时,全部资源的合集叫进程 线程:是程序的最小执行单位,包含计算资源,任何一个操作的响应都是线程完成的.   多线程:多个线程并发执行   Thread 是.net框架封装 ...

  4. PowerShell 中 RunspacePool 执行异步多线程任务

    在 PowerShell 中要执行任务脚本,现在通常使用 Runspace,效率很高:任务比较多时,用 Runspace pool 来执行异步操作,可以控制资源池数量,就像 C# 中的线程池一样 == ...

  5. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  6. .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)

    一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...

  7. .Net进阶系列(10)-异步多线程综述(被替换)

    一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...

  8. NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL

    .NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL,异常处理,线程取消 今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主 ...

  9. Task/Parallel实现异步多线程

    代码: #region Task 异步多线程,Task是基于ThreadPool实现的 { //TestClass testClass = new TestClass(); //Action<o ...

  10. .NET异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消

    今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主,毕竟用的比较多的现在就是这些了,再往前去的,除非是老项目,不然真的应该是挺少了,大概有个概念,就当了解一 ...

随机推荐

  1. Linux学习总结(21)——CentOS7环境下FTP服务器的安装和配置

    1. 安装vsftpd #安装vsftpd yum install -y vsftpd #设置开机启动 systemctl enable vsftpd.service # 重启 service vsf ...

  2. HDU 1325 拓扑排序

    根据题目所给的3个不符合情况的条件,一个个判断图是否符合这3个条件即可 1.不能出现内部环,拓扑排序判断 2.不能有超过1个点的入度为0,因为只有一个树根 3.每个点最多一个入度 这里要注意的一点是这 ...

  3. ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01653: 表 SYS.AUD$ 无法通过 8192 (在表空间 SYSTEM 中) 扩展

    https://blog.csdn.net/zhangyong329/article/details/53421951

  4. Bestcoder #92

    A =w= B 计数题,枚举A.C,算B.D的个数,注意减去重复的 我当时是f[1][n]->f[2][n]->f[3][n]->f[4][n]递推的 C 题意:长为n的字符串仅由' ...

  5. [bzoj 1042][HAOI2008]硬币购物(用容斥原理弄背包)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1042 分析: 解法很巧妙,用f[i]表示四种硬币A.B.C.D的数量不考虑的情况下弄成 ...

  6. endWith is not a function

    解决方法,增加String的扩展 String.prototype.endWith = function(suffix) { return this.indexOf(suffix, this.leng ...

  7. 19、Java并发性和多线程-嵌套管程锁死

    以下内容转自http://ifeve.com/nested-monitor-lockout/: 嵌套管程锁死类似于死锁, 下面是一个嵌套管程锁死的场景: 线程1获得A对象的锁. 线程1获得对象B的锁( ...

  8. 浅谈WEB标准

    WEB标准,WEB标准.可亲可爱的WEB,什么是你定下的标准呢.这几天又又一次回归最基础的知识了,OK.言归正传,什么是WEB标准.为什么要用WEB标准? 比方说,如今的浏览器版本号多吧,chrome ...

  9. Neutron中的网络I/O虚拟化

    为了提升网络I/O性能.虚拟化的网络I/O模型也在不断的演化: 1,全虚拟化网卡(emulation).如VMware中的E1000用来仿真intel 82545千兆网卡,它的功能更完备,如相比一些半 ...

  10. JavaScript初探之——图片移动

    在我们打开页面的时候我们看到的大部分页面都是动态的,曾经学习VB的时候要实现一些动态的画面第一个想到的就是用Flash,如今学习了BS的东西,才算是开眼界了,刚刚学习了一个动画的效果,给大家展示一下. ...