C#窗体Winform,如何实现实时的UI更新效果

时间:2024-11-08 07:42:42

文章开始之前,先看下实时更新界面,以便大家理解题目的意思:

 

如上图,是一张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窗体本身这个对象。您也可以使用控件对象。

 

祝您用餐愉快。