c# WinForm 开发心得

        本人现在基本上只做WinForm开发,在开发过程当中,用到最多的是线程,我们知道,在开发人机实时交互界面的程序当中,线程是最基本的数据处理方式,可以减少界面程序当中假死状态,也可以使程序在执行过程当中,减少主程序的工作量,使一个复杂的业务分任务处理。一个任务可能需要一个线程处理,比如全局计时线程,也可能一个任务需要多个线程处理,比如向远程传输数据,可能因为数据延迟等原因,不可能等一个线程送完数据后,再回来取下一个数据向上送,这个时候就需要开启多个线程,一个线程送一个,不管有没有送完,下一个线程接着送,这个就需要线程的并行处理,并且要保证线程执行完成后,即时回收清理内存,不然很容易造成内存溢出,导致程序报错,比如说相机实时收取图像,并且在界面上显示,这种情况会大量消耗内存,不及时清理,程序报错很正常。

        还有一个,在开发界面程序时,界面显示上,也会出现问题。比如相机实时接收图像并通过PictureBox控件当中,这个过程当中,PictureBox不会释放资源图像,只会一点一点去替换资源,但替换的资源又不是及时清理掉,而是放在内存当中,这样一个是导致内存溢出,另一个是如果是线程传过来的图像数据,我们一般只有两种处理方式,一个是添加Control.CheckForIllegalCrossThreadCalls = false;语句,来忽略控件抛出的异常,这个方式一旦长时间使用,还是会报错,导致控件显示一个大大的“X”图,这时候除了重启程序外,别无它法。还有一种方式,使用this.Invoke方法来实现异步显示,this代表的是当前整个窗体,如果整个窗体需要实时刷新显示的控件太多,会大大降低整个程序的运行速度。还有一个方法就是控件本身Invoke函数,但这个函数我感觉有些假,不能用,如果使用控件本身的Invoke去控制它自身的变化,感觉不太现实,因为我做了一实验,使用PictureBox显示相机图像,同时开始多个线程去处理比较复杂的业务,会导致PictureBox控件崩溃,最后就试了一下,将PictureBox外部套用一个Panel控件,使用Panel的Invoke去控制子控件PictureBox控件,得到的效果非常理想,不会拖慢整体程序的速度,也不会显示报错,我想可能是控件的父容器最将传进去的对象排好队列后,一条一条去送给子控件,因为父容器本身不需要做改变,不会抛出异常,所以处理速度也快,只不过,在资源管理器当中,看到的现象就不一样了,加容器去处理子控件,会导致资源管理器中,看到的线程数量比较高,处理得越复杂,线程数量越高,所以在开发过程当中,最好写一个即时清理自己内存的线程或清理整个电脑资源当中的内存的线程,就像是360Safe当中的内存清理功能,这样可以大大降低程序对电脑的要求。

        最后一个就是全局列表的问题,如IList<string>,在一个线程当中需要增加列表,在另一个线程当中需要减少列表,这个时候,很容易产生冲突从而使程序报错,我的处理方法是在全局变量当中,写一个全局的object变量,如object objstr = new object();在操作列表的时候,使用lock锁定objstr这个变量,当有一个线程在执行内在业务时,另一个只能等了,只有这个业务处理完成后,释放出objstr时,另一个业务才能开始,这样就避开了冲突,但同时,需要消耗的就是电脑资源。

        再有说一点,一个项目的好坏,并不是说代码量大,功能全就是好项目,只有在写程序时,组织好各部分的协调处理业务的能力,在此基础上扩展出的业务都是基于这个框架内的模式上进行扩展,那么这个项目以后无论发生多大的变化,核心是不变的,那么出错的几率就几乎为零。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值