• 执行异步操作
    • CLR使用了WIN的线程处理能力,但保留了与其分离的权利.某些时候CLR的线程与Win的线程不是完全的匹配.
    • 线程的系统开销较大,应限制其数量.
      • 创建:分配并初始化一线程内核对象,保留1M的地址空间(用户模式),12KB的堆栈(内核模式),然后调用DLL函数通知进程中所有DLL操作来通知所有DLL操作又有一新的线程了.
      • 销毁:进程中所有DLL收到一个死亡通知,且释放资源.且当仅有一个CPU时,每隔20ms执行一次上下文切换.
    • CLR线程池.
      • 每个进程一个,被该进程内的所有APP域共享,APP的一个请求会在队列中加一个条目,如果还有线程可用则使用之,如果没有创建一个新的,用完后归还为空闲.当一个线程空闲2Min后,唤醒并终止自己然后释放资源.少数线程节省资源,多数线程时充分利用多CPU.
      • 上限.工作=25.I/O=1000.
      • 未避免过快创建额外的线程.默认两线程创建间隔是500ms.但是可以使用SetMinThreads()来初始化多个线程.
    • 试图访问受限资源时,CLR会进行CAS(检查所有AM是否有权访问资源),然后在有权限的AM中加入访问Code后,方法内部遍历调用线程的堆栈获取权限(调用UnSafe Code时不遍历,成为安全漏洞).当Tread运行时,权限与Thread相结合.
    • 定时器.
      • 1)System.Threading.Timer在另一线程上执行后台进程.
      • 2)System.windows.Forms.Timer将定时器与调用线程相关联,触发后,Win将一Win.Timer插入Message队列,并将其分配到回调方法内,所有工作由一个Thread(设置Timer Thread的=执行的)完成(即Timer方法不可由多线程同时执行).
      • 3)System.Timers. Timer:对1)的包装,派生自Component,只有将Timer至于设计界面上时才会使用它.
      • 内部:所有Timer对象仅有一个CLR的进程,其知Next Timer何时到达,到达后,ClR线程调用池的Queue方法执行回调,如果回调方法执行时间过长,会再次触发池中多个对象同时执行(访问共享数据要同步锁).
      • 使用Timer对象时要有Var Ref以防止被回收.
    • 获知方法是否执行完毕的方法
      • 1)Wait:直接调用EndXXX(),当操作完成时返回结果,未完成时挂起调用线程至完成.
      • 2)轮询:让一个线程定期询问是否完成,耗时.
      • 3)回调:工作项会被加入CLR的池队列中,之后由池线程将其取出并调用一个方法,在该回调方法内,用EndXXX来获取结果.
        • 当方法出现异常,且有回调函数时,异常会被重新抛出.所以应该在EndXXX中Catch.
        • 必须调用EndXXX来释放资源.但是多次调用时结果不定.
        • IAsyncResult内部有一个对BeginXXX调用者的引用,必须用同一对象调用Begin/EndXXX,否则”非法操作Exception”(自定义对象可以).
        • 无法取消一个未完成的异步操作.
        • 每一次的BeginXXX都会创建一个IAsyncResult对象.会有性能上的损失.
        • Win32的很多IO操作都不允许异步.
          • 可以异步调用另一个方法,然后再该方法内调用IO操作.
    • 由于16位为单线程,所以一个Form由一个线程创建,且必有使用该线程处理这个From的动作.32/64位不允许线程池中线程直接操作控件,使得从任何线程中调用Control的invoke,BeginInvoke,EndInvoke会将操作封装到创建Form的线程中.
  • 线程同步
    • FCL保证类型的static方法为线程安全.而不保证其它实例方法的线程安全性.
    • Cache.CPU在时机读取内存时,会将期望值以及该值附近的值放入Cache中.一个线程对内存写时实际上也是先写入Cache中.
      • 这对单核/单一线程CPU没有影响.
      • 但是对于多CPU中多线程访问同一Byte时会出现问题.多线程共享数据时应保持Cache的一致性.
    • Lock(Obj)保证了在异常发生时,对Exit的调用,如果调用静态成员则TypeOf(Obj).
      • 问题:同步块好像拥有一个共有的同步DS与每个object关联,为避免公开锁,在类内定义一个Private Object o= new Object Lock(o);亦可使用已有的私有成员,但是如果内部调用了Lock(this)会死锁.
      • 不能使用值类型变量,对于未装箱的值类型,会在进入/退出时两次装箱,加/解锁施加到两个不同的对象上.此时编译出错,应用装箱后的值.
      • 在Lazy Load中的双检索.
         if(obj ==null)
        {
        lock(obj);
        if(obj ==null) new object();
        }

        Lazy Load

.NET中的异步操作及线程同步的更多相关文章

  1. .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件

    你可以使用临界区(Critical Section).互斥量(Mutex).信号量(Semaphores)和事件(Event)来处理线程同步.然而,在编写一些异步处理函数,尤其是还有 async 和 ...

  2. C#中的几个线程同步对象方法

    在编写多线程程序时无可避免会遇到线程的同步问题.什么是线程的同步呢? 举个例子:如果在一个公司里面有一个变量记录某人T的工资count=100,有两个主管A和B(即工作线程)在早一些时候拿了这个变量的 ...

  3. objective-c中是如何实现线程同步的?

    多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美.这篇文章主要从线程创建与启动.线程的同步与锁.线程的交互.线 ...

  4. Java并发编程:Java中的锁和线程同步机制

    锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...

  5. selenium grid中的多个线程同步执行

    需求:有一个工作流,每一步审批都需要多个领导参与,才能推流程到下一步去 代码思考:多个领导在自己的线程中运行,速度有的快有的慢,如何保证下一步的领导审批时,这个步骤已经激活 如下是代码:思路为:如果这 ...

  6. 编写高质量代码改善C#程序的157个建议——建议72:在线程同步中使用信号量

    建议72:在线程同步中使用信号量 所谓线程同步,就是多个线程在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样 ...

  7. Java中线程同步的理解

    我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源, ...

  8. 改善C#程序的建议6:在线程同步中使用信号量

    原文:改善C#程序的建议6:在线程同步中使用信号量 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两 ...

  9. java中线程同步的理解(非常通俗易懂)

    转载至:https://blog.csdn.net/u012179540/article/details/40685207 Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运 ...

随机推荐

  1. 我的C++笔记(函数部分)

    #include <iostream> #include <cmath>//C++的数学函数库 using namespace std; class Point{ public ...

  2. 00--Qt Creator 你必须要掌握的快捷操作

    Qt Creator 你必须要掌握的快捷操作 多使用快捷键能显著提高工作效率,尽可能减少键盘,鼠标之间切换所浪费的时间.我这里列出个人认为非常重要必须掌握的 Qt Creator 快捷键.看你知道几个 ...

  3. (转)基于MVC4+EasyUI的Web开发框架经验总结(4)--使用图表控件Highcharts

    http://www.cnblogs.com/wuhuacong/p/3736564.html 在我们做各种应用的时候,我们可能都会使用到图表统计,以前接触过一些不同的图表控件,在无意中发现了图表控件 ...

  4. RabbitMQ学习之集群模式

    由于RabbitMQ是用erlang开发的,RabbitMQ完全依赖Erlang的Cluster,因为erlang天生就是一门分布式语言,集群非常方便,但其本身并不支持负载均衡.Erlang的集群中各 ...

  5. codeforce 788 A. Funtions again

    链接 A. Functions again 题意 这是一道求最大连续子序列和变形题. 做法 先将abs(a[i+1]-a[i]算出来,然后用两个数组dp[i],cp[i],dp维护其最大值,cp维护其 ...

  6. Vue2实例中的data属性三种写法与作用

    <script src="https://unpkg.com/vue/dist/vue.js"></script> <div id="app ...

  7. JavaScript JSON简单操作(增删改)

    JavaScript 中对json处理: 声明;: var json={};或 json={"name":"asd","age":24}; ...

  8. HDU 5307 He is Flying (生成函数+FFT)

    题目传送门 题目大意:给你一个长度为$n$的自然数序列$a$,定义一段区间的权值为这一段区间里所有数的和,分别输出权值为$[0,\sum a_{i}]$的区间的长度之和 想到了生成函数的话,这道题并不 ...

  9. 【Codeforces Round #493 (Div. 2) B】Cutting

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然只有在前i个位置奇数偶数出现次数都相同的地方才能切. (且不管前面怎么切,这里都能切的. 那么就相当于有n个物品,每个物品的代价 ...

  10. Python docs

    刚刚发现了Python好用的文档查询网页:Python docs,可以选择python版本查询,跟OpenCV docs很相似,很好用-