本人没做过基于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++)

最低0.47元/天 解锁文章
613

被折叠的 条评论
为什么被折叠?



