标签:
(1)
//修改按钮的Enabled属性
private void ModifyButton( bool _b )
{
this.Button1.Enabled = _b;
}
(2)
//声明上面方法的委托
private delegate void ModifyButton_dg( bool _b );
(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()
{
  }
}
注意代理的使用!
标签:
原文地址:http://www.cnblogs.com/zhoug2020/p/5837764.html