Invoke()的做用是:在应用程序的主线程上执行指定的委托。通常应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke();编程
(1)安全
//修改按钮的Enabled属性多线程
private void ModifyButton( bool _b )this
{spa
this.Button1.Enabled = _b;线程
}代理
(2)orm
//声明上面方法的委托对象
private delegate void ModifyButton_dg( bool _b );blog
(3)
//调用委托
private void Calldelgate( )
{
/*在Windows窗体应用程序中使用this.Invoke 在WPF应用程序中使用this.Dispatcher.Invoke*/
this.Invoke( new ModifyButton_dg( ModifyButton ) ,new object[]{false});
}
(4)
能够在非UI线程中调用 ,如:
//建立线程
Thread _t = new Thread( new ThreadStart( threadmethod ));
_t.Start();
//线程入口
private void threadmethod ()
{
//其余代码省略
Calldelgate();
}
线程会在UI线程和辅助线程之间相互转换
例如:
举个简单例子说明下使用方法,好比你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..
using System.Threading;
//启动一个线程
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();
//线程方法
private void DoWork()
{
this.TextBox1.Text="我是一个文本框"; /*在多线程中直接调用界面控件的方法是错误的作法*/
}
若是你像上面操做,在VS2005或2008里是会有异常的...
正确的作法是用Invoke\BeginInvoke
using System.Threading;
namespace test
{
public partial class Form1 : Form
{
public Form1()
①//更新窗体中的TextBox1显示内容的方法
public void UpdateForm(string param1,string parm2)
{
this.textBox1.Text = param1+parm2;
}
②//声明委托
③//调用委托
private void Calldelegate()
{
/*在Windows窗体应用程序中使用this.Invoke 在WPF应用程序中使用this.Dispatcher.Invoke*/
this.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
//this.Dispatcher.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
}
④//建立新线程
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
}
⑤//新线程入口
public void DoWork()
{}}注意代理的使用!