Net2.0安全线程编程实践

前不久做了一个winform的项目,在项目中涉及了大量的线程操作(也会有异步调用),在处理这些线程操作的时候不得不做大量的测试、优化,而且 还容易出问题,而且还设计很多的界面控件的属性控制,搞的我非常的头疼。用异步线程来做的话,不安全,还容易产生死锁,虽然.net提供了线程类,可是当 在线程中一旦涉及有Thread.Sleep()操作的时候,原来的线程就会被注入,进而导致界面不能够被更新。为了解决这个问题,我查阅了相关的资料, 且听风吟写的不错的一篇文章《c#中使用多线程访问winform中控件的若干问题 》 对我起到了一些帮助,可是随之而来的问题就是,编码量特别的大,如果按照且听风吟的文章提供的方法,我写这个程序写的非常的辛苦,虽然解决了 Thread.Sleep()的问题,但是却不能保证是线程安全的。为什么这么说,虽然.net提供了线程类,可是如果没有深厚的积累,丰富的经验,是不 能把复杂的线程处理好的。直到今天,我才发现原来.net2.0已经提供了backgroundWorker组件,使用它就可以很容易的写出线程安全的软 件来。

有关它的介绍,大家可以参考《VS2005中BackgroundWorker组件的使用经验 》

以下是我做的一个demo,比较简单,代码如下:

 


using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Drawing;
using  System.Threading;
using  System.Windows.Forms;
using  System.Xml;


namespace  UseBackgroundWorker
{
    
public   partial   class  Form1 : Form
    {
        
private  XmlDocument document  =   null ;
        
public  Form1()
        {
            InitializeComponent();
        }

        
private   void  dowloadButton_Click( object  sender, EventArgs e)
        {
            
this .backgroundWorker1.RunWorkerAsync();
            
this .dowloadButton.Enabled  =   false ;
            
while  ( this .backgroundWorker1.IsBusy)
            {
                Application.DoEvents();
            }
            
this .dowloadButton.Enabled  =   true ;
        }

        
private   void  backgroundWorker1_DoWork( object  sender, DoWorkEventArgs e)
        {
            document 
=   new  XmlDocument();
            document.Load(
@" http://www.tailspintoys.com/sample.xml " );
            Thread.Sleep(
5000 );           
        }

        
private   void  backgroundWorker1_RunWorkerCompleted( object  sender, RunWorkerCompletedEventArgs e)
        {
            
if  (e.Error  ==   null )
            {
                MessageBox.Show(document.InnerXml, 
" Download Complete " );
            }
            
else
            {
                MessageBox.Show(
                    
" Failed to download file " ,
                    
" Download failed " ,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
            }
        }
    }
}

  backgroundWorker组件是.net2.0开始提供的组件,也是微软推荐大家使用的组件,通过它,我们不难发现,原来编写一个线程安全的程序是如此的简单。

你可能感兴趣的:(多线程,编程,优化,.net,C#,WinForm)