c#:winform中多线程的使用

时间:2024-04-14 18:29:02

最近由于在做一些demo之类的小测试,所以winform程序用的多了点。但是在使用的过程中发现在winform中对多线程的应用的相关知识变得模糊,所以就多看了相关知识点并整理测试了部分,记录相关内容,算是笔记,也方便以后的查阅。

其实我主要就打算记录两个点

第一个是关于大量任务下窗体的等待效果,或者说人机交互的友好性。关于这一点,我在网上也搜了相关的资料,但是发现都写的大同小异。所以本文以一个例子为基础,整理出一个弹框进度条提示的效果案例。同时我个人觉得这个案例的扩展和代码简洁性相对较好。

废话不多说,直接撸代码。

如下图所示的,是一个“主”窗体。这个窗体中定义了代理、进度条窗体实例等内容,当然也有执行任务的按钮事件。

几点说明。如图中箭头1部分,原案例中是单独定义了一个方法(箭头4部分)作为代理的参数,但是其实这个方法只是实现了进度条窗口的实例化及显示,所以我觉得用匿名方法就可以了。箭头2部分,这里其实就是业务逻辑的实现地方,只不过现在用了Thread.Sleep(100)代替了。箭头3部分,主要是给进度条传递当前进度,并且传递需要的提示信息。

c#:winform中多线程的使用

下图是具体的进度条窗体中的代码,非常的简单,可以直接ctrl+cctrl+v的。当然返回的结果可根据业务需要进行调整。

c#:winform中多线程的使用

效果如下

c#:winform中多线程的使用

 

第二个是关于在多线程中对主线程控件进行操作的问题。

Winform中的多线程使用,一个不小心就会遇到“线程间操作无效: 从不是创建控件的线程访问它”这样的提示。我想大家都是有体会的。

传统方式是定义一个代理,然后写方法处理,而且这个方法里还要做判断。相对来说,代码还是比较多的,主要是写的地方多(这是得有多大的强迫症啊~)。这种写法度娘上一搜一大片,这里就不多说了。我想介绍的如下图所示的“最简单写法”。如果有多个地方使用就单放一个方法里面调用,如果只有一个地方,直接写就行。

c#:winform中多线程的使用

当然了,多线程的知识绝不只是这么一点,我只是记录了一些典型的,我会忘记的点而已。