Winform多线程处理

        本人没做过基于WPF的应用程序,对数据驱动不太了解,没具体做过,经常做的一些是基于Winform的应用程序,在很多即时操作场景当中,对于多线程操作,大多数都一知半解,我也一样,但通过这些年的总结学习和使用,总结出一套使用多线程与窗体异步交互的操作。

        多线程有多种操作方式,如Winform自带的BackgroundWorker控件,但对于真正开发时,本人使用的时候是非常少的,原因在于使用起来麻烦不说,还容易出错。再一个就是使用Thread函数,来自定义线程操作,我们可以将窗体看成是一个整体,线程代表各自执行的任务,每个任务执行完成后,告诉窗体如何显示,在Winform中,我喜欢在线程当中,使用事件触发的方式,来将信息反馈给窗体,这样既可以保证代码的整体逻辑晰,阅读性高,还可使线程中的各部分分工明确,即使一部分出问题,不影响整体。

        那么来说一说多线程的交互方式,在framework2.0以后,使用多线程时,要么使用CheckForIllegalCrossThreadCalls忽略线程错误,这样可以将数据直接反馈给窗体,缺点就是,当数据交互比较频繁时,容易出现数据冲突或内存错误,导致窗体显示部分的崩溃。第二,是使用delegate来交替实现,缺点是容易出现混乱,并且对于各部分操作来讲,每操作一个控件,写一堆委托,太麻烦。framework 3.0以后,出现了一个action,这个是一个简易的委托,可以减少委托的使用,太不可避免有访问不到窗体线程的时候,这时候需要一个控件的RequiadInvoke来判断,或者直接不判断,使用this.Invoke来直接异步,简单粗爆,但不可避免的还是会出现是否需要异步的操作,使程序崩溃,最后一个是使用AsyncOperation来实现,这个是异步操作管理器,我现在基本上是使用这个加Thread来实现整个窗体界面的线程与窗体之间的异步交互。以前上是我所使用过的所有线程操作方式,对比来讲,最后一个是最好的,前面的如果在操作频繁的程序当中,容易产生大量的Handle句柄,当超出65535个的时候,程序必然会崩溃,原因就是在程序执行线程过程当中,系统每生成一次线程,就会产生一个Handle,但当我们使用完成后,系统不会立即收回,而是在一定时间之后,才会收回。而AsyncOperation是可以告诉系统,所有线程使用的异步操作,立即可以收回。

        那么,如何使用AsyncOperation呢?当然,网上百度搜索一下,可以找出一堆的用法,但结合整体的程序,而不出问题的,基本没有,怎么使用,需要我们自己具体问题具体分析,而我在使用时,结合总结,使AsyncOperation可以基本上满足各种需求,举个例子:

public partial class Form1 : Form

{

        public Form1()

        {

                InitializeComponent();

        }

        private void button1_click(object sender, EventArgs e)

        {

                 Label1.text = string.Empty;

                for(int i = 0;i<1000;i++)

         

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值