• 执行异步操作
    • 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. hdu3488 / hdu3435 / hdu1853 最小费用最大流 圈 拆点

    题目大意: 在一个有向图中,求经过所有点的最小圈. 思路: (如果是用二分图的完美匹配来做,那么直接上模版就好了).http://www.cnblogs.com/Potato-lover/p/3991 ...

  2. (转载)TNSPING命令

    Oracle Net 工具(命令)tnsping,是一个OSI会话层的工具,它用来: 1)验证名字解析(name resolution,当然是oracle自己的网络服务名) 2)远程的listener ...

  3. OnLineML一:关于Jubatus 的简介...

    一:简介:原文链接:jubat.us/en/  xuwenq.iteye.com/blog/1702746 Jubatus http://jubat.us/en/overview.html 是一个面向 ...

  4. 位姿检索PoseRecognition:LSH算法.p稳定哈希

    位姿检索使用了LSH方法,而不使用PNP方法,是有一定的来由的.主要的工作会转移到特征提取和检索的算法上面来,有得必有失.因此,放弃了解析的方法之后,又放弃了优化的方法,最后陷入了检索的汪洋大海. 0 ...

  5. Computer Vision的尴尬

    原文: Computer Vision是AI的一个非常活跃的领域,每年大会小会不断,发表的文章数以千计(单是CVPR每年就录取300多,各种二流会议每年的文章更可谓不计其数),新模型新算法新应用层出不 ...

  6. 杭电 1040 As Easy As A+B 【排序】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1040 解题思路:数据不大,可以直接用冒泡排序 #include<stdio.h> int ...

  7. 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子

    1. 一个简单的Quartz 工程     本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...

  8. 配置thinkphp项目遇到的坑

    坑一: nginx配置必须改成伪静态配置 否则出现nginx 403 forbiddem错误 坑2: 缓存目录权限必须开放 坑3:服务器权限准备: 坑4:防火墙关闭 systemctl stop fi ...

  9. Jquery 根据HTML内容选择元素

    选择所有包含 "is" 的 元素: $("p:contains(is)")

  10. BA-siemens-BA模块特性

    PXC24(包含UEC24的模块特性) DO点可以接220vac的电压,渠道人员告知电流不要超过2A AO点只能输出0-10V的电压,不能输出4-20ma的电流,说明书上是错误的 AO点输出10v失败 ...