前不久做了一个winform的项目,在项目中涉及了大量的线程操作(也会有异步调用),在处理这些线程操作的时候不得不做大量的测试、优化,而且还容易出问题,而且还设计很多的界面控件的属性控制,搞的我非常的头疼。用异步线程来做的话,不安全,还容易产生死锁,虽然.net提供了线程类,可是当在线程中一旦涉及有Thread.Sleep()操作的时候,原来的线程就会被注入,进而导致界面不能够被更新。为了解决这个问题,我查阅了相关的资料,且听风吟写的不错的一篇文章《c#中使用多线程访问winform中控件的若干问题》对我起到了一些帮助,可是随之而来的问题就是,编码量特别的大,如果按照且听风吟的文章提供的方法,我写这个程序写的非常的辛苦,虽然解决了Thread.Sleep()的问题,但是却不能保证是线程安全的。为什么这么说,虽然.net提供了线程类,可是如果没有深厚的积累,丰富的经验,是不能把复杂的线程处理好的。直到今天,我才发现原来.net2.0已经提供了backgroundWorker组件,使用它就可以很容易的写出线程安全的软件来。
Code
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Drawing;
usingSystem.Threading;
usingSystem.Windows.Forms;
usingSystem.Xml;
namespaceUseBackgroundWorker
{
publicpartialclassForm1:Form
{
privateXmlDocumentdocument=null;
publicForm1()
{
InitializeComponent();
}
privatevoiddowloadButton_Click(objectsender,EventArgse)
{
this.backgroundWorker1.RunWorkerAsync();
this.dowloadButton.Enabled=false;
while(this.backgroundWorker1.IsBusy)
{
Application.DoEvents();
}
this.dowloadButton.Enabled=true;
}
privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkEventArgse)
{
document=newXmlDocument();
document.Load(@"http://www.tailspintoys.com/sample.xml");
Thread.Sleep(5000);
}
privatevoidbackgroundWorker1_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse)
{
if(e.Error==null)
{
MessageBox.Show(document.InnerXml,"DownloadComplete");
}
else
{
MessageBox.Show(
"Failedtodownloadfile",
"Downloadfailed",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
}
backgroundWorker组件是.net2.0开始提供的组件,也是微软推荐大家使用的组件,通过它,我们不难发现,原来编写一个线程安全的程序是如此的简单。
优质内容筛选与推荐>>
1、MSDN_Soft_Download2、2006年度超强语录集锦50条3、提高网站打开速度的18点要素4、php用soap创建webservice5、[经典算法] 排列组合-全排序