1.流程:
1.1 定义一个委托,形如:public delegate object WorkThread(object controlsAndParameters);由于object可以容纳任何.Net类型,当然可以传入一个object数组,这样就可以传入任意多的主线程控件对象和工作者线程需要的参数对象,同时返回值也是object,故主次线程的对象可以实现某种意义上的共享 1.2 实现工作者线程承载的函数,如:object DoSomething(object controlsAndParameters);形式与1.1中的委托一致。在此函数中可以动态控制传入的控件对象,表明此线程的执行状态。 1.3 主线程中声明委托实例,WorkThread wh = new WorkThread(DoSomething); 1.4 异步调用,开启工作者线程,IAsyncResult iar = wh.BeginInvoke(controlsAndParameters,new AsyncCallback(DoComplete),controls); 1.5 实现异步调用结束函数:void DoComplete(IAsyncResult);将1.4中的放回值iar传入,而iar实际上是System.Runtime.Remoting.Messaaging空间中AsyncResult类的实例,AsyncResult类有两个重要的属性:(1)AsyncDelegate:指向原始委托的引用,即wh;(2)AsyncState:指向BeginInvoke中的最后一个传入参数,即controls;由(1)得到原始委托,并调用EndInvoke()得到DoSomething的返回值,由(2)可在异步调用结束时对界面 进行适当的控制。2.缺点:
2.1 由于DoSomething()和DoComplete()都是在工作者线程中执行,所以按上述形式,最终工作者线程的执行结果是在工作者自己处理的,如果主线程要得到执行结果,就必须自己轮询判断工作者线程是否执行结束,非常不方便。
参考:《C#与.NET 4高级程序设计 (第5版) 》