今天拜读了别人的代码,发现自己又一次孤陋寡闻.
System.ComponentModel提供了很多丰富的对象让编程更简单,很容易地达到你要实现的目的,避免自己写更多的逻辑来实现你要的需求。
假设我们的产品是一个网站,它需要获取internet上其它网站的信息,比如股票,天气预报。要获取这样的附属信息一般不能用主线程直接获取,因为要频繁地获取这样的信息势必会影响网
站的性能,那就用.net提供的后台进程以异步的方式来执行吧!多线程我们首先想到的是new System.Threading.Thread对象来实现,但我们这里只是期望一个不怎么“重要”的线程,或
者说不频繁使用,或者是仅仅执行一个操作(可以理解为一个事件),那么可以采用System.ComponentModel.BackgroundWorker来做更贴切。
看看他的用法:
1. 首先new 一个实例: private System.ComponentModel.BackgroundWorker backgroundGetData = new System.ComponentModel.BackgroundWorker();
2.定义一个后台进程执行任务的事件,名称为 BackgroundGetData_DoWork,类型是DoWorkEventHandler . 代码如下:
private void BackgroundGetData_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
XDocument doc = XDocument.Load(url);
//很容易从这个doc里面获取天气,股票信息了,因为XDocument能够把一个url例如http://www.nasdaq.com/aspxcontent/NasdaqRSS.aspx?data=quotes&symbol=CAC.
//怎么处理这个xml来获取这些信息就不在这里写了。只需记住给System.Xml.Linq.XDocument传入一个正确的url即可。
}
3.注册这个事件: this.backgroundGetData.DoWork += new System.ComponentModel.DoWorkEventHandler(this.BackgroundGetData_DoWork);
4.倒数第二步是异步调用这个后台进程.
很简单,即使是不同进程间调用,只要知道这个后台进程是定义在主线程里的,所以只需知道这个后台对象的实例,你就可以执行它里面的方法:
/// <summary>
/// Retrieve the data on a separate thread. Async call.
/// </summary>
public void GetOnlineData()
{
System.Diagnostics.Trace.WriteLine("GetOnlineData(): Retrieving new data for the scroll queue.");
if (!this.backgroundGetData.IsBusy)
{
this.backgroundGetData.RunWorkerAsync();
}
}
5.最后就是不要忘记自己写代码销毁它。怎么销毁呢?定义了后台进程的这个类实现这个IDisposable这个接口,在Dispose()方法里写代码就好了。
public void Dispose()
{
if (this.backgroundGetData != null)
{
this.backgroundGetData.Dispose();
this.backgroundGetData = null;
}
}
最后,补充一句,虽然System.ComponentModel.BackgroundWorker提供了异步执行的机制,但是后台进程如果频繁执行异步,比如每10秒执行一次,由于我的主程序是个使用WPF做效果的winform程序,后台的异步操作会影响到我主程序界面的执行效果,比如部分界面元素丢失,而且感觉程序执行效果会很卡。
分享到:
相关推荐
System.ComponentModel.BackgroundWorker 线程引用
利用BackgroundWorker后台检测Internet连接是否可用利用BackgroundWorker后台检测Internet连接是否可用
using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.IO.Pipes; using System.IO; ...
C#,使用,BackgroundWorker ,实现,后台操作窗体 C#,使用,BackgroundWorker ,实现,后台操作窗体 C#,使用,BackgroundWorker ,实现,后台操作窗体 C#,使用,BackgroundWorker ,实现,后台操作窗体 C#,使用...
BackgroundWorker组件和Thread更新UI界面对比
using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading;using System.Windows.Forms; namespace TestBackgroundWork{ public partial ...
示例: 下面的代码示例演示如何使用 BackgroundWorker 组件从 URL 加载 XML 文件。用户单击“下载”按钮时,Click 事件处理程序将调用 ... using System.ComponentModel; using System.Drawing; using System.Thre
在android和ios中实现类似c#的BackgroundWorker的代码
using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WinFormApp { public partial class Form2 : Form {
BackgroundWorker Demo
vb.net,vs2010,对msdn上的BackgroundWorker类的一个实例作深入全面透彻的解释与分析,如果你还不理解,那就请下载我的别一个自己写的关于BackgroundWorker的一个实例,看了这两个实例,包您对BackgroundWorker类的...
backgroundworker全面深入透彻解析,vb.net,vs2010,对msdn上的BackgroundWorker类,自己写了一个实例,深入全面透彻的解释与分析BackgroundWorker的用法,它是通过我几天几夜奋战的结果,如果你还不了解,那就只能靠...
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示...
虽然实现异步后台任务的方法很多,而且随着类库的更新,方法会更多更简单更灵活...不过,BackgroundWorker组件不应该被忽略,当初它的出现,正是专用于处理后台长时间运行的任务的,组件会自行处理线程调度,比较实用。
简单介绍了System.Windows.Forms.Timer 和 BackgroundWorker实现实时更新画面的方法以及他们的区别。 作者Email: qiuye1pian@sina.com 运行环境: Vs2008 sp1 .net Framework3.5
VB.net BackgroundWorker使用例子
BackgroundWorker 简单应用示例,里面详细介绍了BackgroundWorker并附有示例