普通的对控件操作的语句中,对主线程的UI(user interface)只能在主线程中进行操作与更改,如果在多线程下,或者在WebService以及Socketk的异步调用的回调函数(我觉得在WebServcie和Socket的异步调用中,.NET Framework本身应该会新建一个线程,或者使用线程池中的线程,去等待回调函数的执行,所以本质上都是多线程情况下,对主线程UI的操作)中,需要对UI进行操作,那么可以调用控件的Invoke方法,它在任何线程中进行调用都是安全的。 声明一个委托:delegate void MethodInvoker(); 这个委托没有参数,也没有返回值。 在多线程所要调用的函数中这样调用Invoke方法: this.Invoke(new MethodInvoker(UpdateUI)); 其中UpdateUI就是所要进行更新主线程UI的方法,new MethodInvoker()是实例化了一个MethodInvoker委托。 如果UpdateUI的语句很少,可以不必声明函数,而直接写一个匿名函数: this.Invoke(new MethodInvoder(delegate(){textBox1.text="test";})); delegate(){语句;}就是一个匿名函数,它也可以有参数。 在匿名函数的基础上,还有更强大的Lambda 表达式可以使用,“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。但是它只能在.Net Framework3.5以上的版本中使用,例如:
del myDelegate = x => x * x; int j = myDelegate(5); //j = 25
myDelegate就是一个委托的实例,它的参数是x,它的函数语句是x*x;
myDelegate(5)将参数5传给了委托的实例,执行函数体x*x后,就返回函数值,5*5=25。
关于Lambda表达式的详细信息,可参见http://msdn.microsoft.com/zh-cn/library/bb397687.aspx
如果委托方法有多个参数,则应给this.Invoke传递两个参数,其中一个是委托的实例,另一个是object数组,数组中储存的值,就是要传给委托方法的参数。