• c#异步多线程


    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里写日志。
     
     
  • 相关阅读:
    网页打开速度的心理学
    UML建模——用例图(Use Case Diagram)
    漫谈干系人识别管理
    干系人分析的3个方法:除了目标用户还要考虑谁?
    计算机网络-复习笔记
    项目经理必掌握的国际项目管理知识体系结构及内容
    剑指Offer面试题:5.重建二叉树
    剑指Offer面试题:4.从尾到头打印链表
    剑指Offer面试题:3.替换空格
    剑指Offer面试题:2.二维数组中的查找
  • 原文地址:https://www.cnblogs.com/chenxizhaolu/p/8426282.html
Copyright © 2020-2023  润新知