参考: http://www.cnblogs.com/zhjp11/archive/2009/11/20/1606912.html
http://www.csharpwin.com/csharpspace/10823r5320.shtml C#异步调用与线程总结
http://blog.csdn.net/byxdaz/article/details/6737639 C#多线程编程
http://www.jb51.net/article/34804.htm BackgroundWorker创建多个线程的教程
首先介绍一下BackgroundWorker的相关属性和方法:
属性:
WorkerReportsProgress:是否可以报告进度。
WorkerSupportsCancellation:是否允许异步中止。
IsBusy:是否在运行。
CancellationPending:判断BackgroundWorker是否已经异步取消。
方法:
RunWorkerAsync:开始执行任务。触发DoWork事件
ReportProgress:异步提醒,触发ProgressChanged事件,但是这个如果可以使用,必须设置WorkerReportsProgress为True
CancelAsync:取消BackgroundWorker操作。
事件:
DoWork:执行RunWorkerAsync后触发,异步执行的认为。 该事件中进行耗时的操作,但是不要涉及对UI元素的操作
ProgressChanged:执行ReportProgress时触发,异步获得进度。
RunWorkerCompleted:线程结束时触发,主要有成功结束,发生异常或者取消时发生。
异步回调。这个方法是最为推荐的方法。
那么什么是异步回调呢?或许刚刚大家有注意到在调用Delegate.BeginInvoek()方法时,只有有三个参数BeginInvoke(object parameter,AsyncCallback asynccallback,object state),上面只讲第一个参数,也就是委托调用的有参函数所需的参数,多个参数也可以,只需要按照委托声明时的顺序依次添加就可以了,第二个是一个AsyncCallBack类型的委托也就是异步操作执行完后要执行的委托函数,比如需要返回结果、输出什么的都可以在这个委托函数里执行,该委托函数必须有一个IAsyncResult类型的参数。第三个是额外的状态参数,一般都是该委托对象。
下面通过实例给大家进行讲解。
第一步还是先建立一个委托
delegate string SayHello(string name);
主函数:
static void Main(string[] args)
{
Console.WriteLine("主线程的ID:" + Thread.CurrentThread.ManagedThreadId);//标记显示主 线程ID
SayHello sayhello = new SayHello(Say);
IAsyncResult iResult=sayhello.BeginInvoke("Olive",new AsyncCallback(Result), sayhello);//三个参数:1、Say()函数的参数,2、AsyncCallback类型的委托,(异步操作结束后执行的委托函数),3、将sayhello对象作为状态参数,在Result函数中会有用到该参数
Console.ReadKey();
}
//AsyncCallback委托所执行的函数
private static void Result(IAsyncResult iasyncresult)
{
SayHello sayhello = (SayHello)iasyncresult.AsyncState;//获取IAsyncResult对象的AsyncState的属性,即为Delegate.BeginInvoke()的第三个参数即sayhello。
string s = sayhello.EndInvoke(iasyncresult);
Console.WriteLine(s + "------好了,异步调用到这里已经结束了");
}
private static string Say(string name)
{
Console.WriteLine("Hello!--------" + name);
Console.WriteLine("当前的线程ID为:" + Thread.CurrentThread.ManagedThreadId);
return "I Love you " + name;
}
定义一个委托实现回调函数 public delegate void CallBackDelegate(string message); 程序开始的时候 //把回调的方法给委托变量 CallBackDelegate cbd = CallBack; //启动线程 Thread th = new Thread(Fun); th.Start(cbd);//开始线程,代入参数 //线程执行的方法 参数是个委托, 线程中参数需要用object类型. public void Fun(object o) { //这里是你的操作代码,循环,根据条件退出while while(true) { } //把传来的参数转换为委托 CallBackDelegate cbd = o as CallBackDelegate; //执行回调. cbd("这个线程传回的信息"); } //回调方法 private void CallBack(string message) { //主线程报告信息,可以根据这个信息做判断操作,执行不同逻辑. MessageBox.Show(message); }