在开发多线程的程序的时候接触了.NET里面的自旋。这个自旋可以将线程暂停指定的时间,而使用Sleep的话,则是让线程执行无意义的内耗循环。
如下图:
Threading.Thread.Sleep 1000
------------[开始Sleep]---CPU在该线程上循环执行空指令,并且检查时间是否达到延时设定---------------[时间到达,接触延时,继续执行程序]---------------
这个整个过程,CPU资源都在都在执行本程序。
Threading.SpinWait.SpinUntil(Function() False, 100)
-------------[开始自旋]--------[每100ms检查条件是否为真]----[为假,则本线程挂起,CPU执行别的线程的指令]-----[为真,则直接执行接下来的指令]-----------
二者相比较,可以看出。对于自旋来讲,挂起线程的时间,CPU被释放,来执行别的线程的任务;对比看,对于Sleep来讲,这个100ms的时间,CPU都在反复检查延时是否到达,并没有释放给别的程序。
所以,使用Threading.SpinWait.SpinUntil来进行多线程中的死循环延时处理,可以大大降低CPU的占用率,提高程序的响应效率。
单线程,如果按钮中有较多的循环,可能导致卡顿。如果使用application.Doevents虽然可以让窗体恢复活动,但是CPU占用率依然高。
向下面这样,将Application.DoEvents()与Threading.SpinWait.SpinUntil结合起来,可以使得在单线程条件下按钮中的大量处理不至于影响CPU占用率,实测显示CPU占用率占用率降低到了2%-3%