参考: 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);//三个参数:1Say()函数的参数,2AsyncCallback类型的委托,(异步操作结束后执行的委托函数),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;

        }


c#子线程执行完怎么通知主线程

定义一个委托实现回调函数
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);
}



本文转载:CSDN博客