文章开始之前,先看下实时更新界面,以便大家理解题目的意思:
如上图,是一张Winform窗体界面的实时更新图,那么如何实现这种效果呢?
一、解答
这里其实是线程的运用。
您不一定需要真正的懂得多线程的原理,但至少一些了解还是要的。
线程主要分为UI线程和CPU线程两种。
UI线程:就是主线程,负责显示界面的,与界面有关的数据响应都会通过UI线程传递到界面上。不单是Winform,所有的,比如Html界面、比如Chrome浏览器界面等,显示界面都离不开UI线程。
CPU线程:是后台线程。负责在后台执行任务作业的。
二、线程之间的相互作用
本文不是主要讲解多线程的文章,我可能后面会出一篇多线程的文章。
您需要知道一点,UI线程是负责界面显示交互的,所以,一旦有过多的任务,或者这么说吧,有很耗时的任务在UI线程上来执行或者运算,那么UI线程就等待它执行完成,然后才会继续往下走。
这么一说,您应该就明白一个关键点:耗时任务因为需要等,所以就造成了我们常说的UI线程阻塞,界面就很卡。
如果您想让界面不卡,就不能让过多的任务在UI线程执行,这里是指时间复杂度过高的任务。
那么对于CPU线程,您就可以等待了,因为它是独立的,不会阻塞UI线程。您可以将耗时任务放在这里运行。
三、如何使用后台线程
回到本文主题,怎么样让界面不卡,可以一直不停的实时更新呢,答案就是要启动一个CPU后台线程。然后让CPU线程通过运算得到结果后,马上调用UI主线程把结果显示出来。这样就很快了。
四、代码如何写?
代码是简单的,您仅需要新建一个Task即可,类似如下:
通过可以马上启动一个线程。
特别的,当您在使用同步异步关键字时,要注意await将会等待。关于它的原理,我可能后面再写文章,您现在知道通过即可创建新线程实现本文的实时刷新效果就好。
五、如何将结果显示到UI线程上
前面有提到过,将计算结果显示回UI线程上,只需要调主线程即可,代码如下:
通过控件对象的Invoke方法即可返回UI线程。这里用的this是指Form窗体本身这个对象。您也可以使用控件对象。
祝您用餐愉快。