在线程方法里写传委托,然后通过Invoke将该委托传递给GUI线程
public delegate void 委托类型(string msg);//首先声明一个委托类型
委托类型 委托变量;//声明该委托类型的成员
private void myButton_Click(object sender, EventArgs e)
{
委托变量 = new 委托类型(委托方法);//委托与方法挂钩
Thread t = new Thread(new ThreadStart(doSomeThing));//新开线程
t.Start();//线程启动
}
private void doSomeThing()
{
if (控件名.InvokeRequired)//如果跨线程调用
{
this.控件名.Invoke(委托变量, new object[] { "Message!" });//Invoke委托方法
}
}
private void 委托方法(string p)//这个是委托方法。
{
this.控件名.Text = p;
}
部份源码:
#region 跨线程调用
delegate void 跨线程委托( string text );
跨线程委托 跨线程委托变量名;
private int Pint = 0;
//一、先将委托变量的方法指向为 跨线程委托方法
//二、将线程的方法指向为 跨线程数数
//三、在 跨线程数数 中BeginInvoke,参数为(委托变量,数字)
//以上过程为先读取下一个数字,然后显示到myTextBox中
private void button跨线程调用_Click( object sender , EventArgs e )
{
跨线程委托变量名 = new 跨线程委托 (跨线程委托方法);
Thread thread = new Thread (new ThreadStart (跨线程数数));
thread.Start (); //开始
}
private void 跨线程数数()
{
for(int i = 0 ; i < 20 ; i++)
{
if(myTextBox.InvokeRequired)//如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false
{
myTextBox.BeginInvoke (跨线程委托变量名 , 跨线程数字增加 ());
Thread.Sleep (2000);
}
else
{
跨线程委托方法 (i.ToString ());
}
}
}
private string 跨线程数字增加()
{
Pint = Pint + 1;
return Pint.ToString ();
}
private void 跨线程委托方法( string text )
{
myTextBox.Text += text + System.Environment.NewLine;
myTextBox.Refresh ();
}
#endregion 跨线程调用
#region 进度条
private delegate void 进度条委托( int myInt );
private 进度条委托 进度条委托变量名;
private void button进度条_Click( object sender , EventArgs e )
{
进度条委托变量名 = new 进度条委托 (进度条委托方法);
Thread thread = new Thread (new ThreadStart (进度条数数));
thread.Start ();
}
private void 进度条数数()
{
while(true)
{
if(this.InvokeRequired)
{
if(Pint > 20)
{
MessageBox.Show ("进度条最大了");
break;
}
else
{
this.BeginInvoke (进度条委托变量名 , Pint++);
}
}
else
{
MessageBox.Show ("在同一线程");
break;
}
Thread.Sleep (200);
}
}
private void 进度条委托方法( int myInt )
{
label进度条最大数.Text = myInt.ToString ();
myTextBox.Text = myInt.ToString ();
myTextBox.Refresh ();
label进度条最大数.Refresh ();
progressBar1.Value = myInt;
progressBar1.Refresh ();
}
#endregion 进度条
public delegate void 委托类型(string msg);//首先声明一个委托类型
委托类型 委托变量;//声明该委托类型的成员
private void myButton_Click(object sender, EventArgs e)
{
委托变量 = new 委托类型(委托方法);//委托与方法挂钩
Thread t = new Thread(new ThreadStart(doSomeThing));//新开线程
t.Start();//线程启动
}
private void doSomeThing()
{
if (控件名.InvokeRequired)//如果跨线程调用
{
this.控件名.Invoke(委托变量, new object[] { "Message!" });//Invoke委托方法
}
}
private void 委托方法(string p)//这个是委托方法。
{
this.控件名.Text = p;
}
部份源码:
程序代码
#region 跨线程调用
delegate void 跨线程委托( string text );
跨线程委托 跨线程委托变量名;
private int Pint = 0;
//一、先将委托变量的方法指向为 跨线程委托方法
//二、将线程的方法指向为 跨线程数数
//三、在 跨线程数数 中BeginInvoke,参数为(委托变量,数字)
//以上过程为先读取下一个数字,然后显示到myTextBox中
private void button跨线程调用_Click( object sender , EventArgs e )
{
跨线程委托变量名 = new 跨线程委托 (跨线程委托方法);
Thread thread = new Thread (new ThreadStart (跨线程数数));
thread.Start (); //开始
}
private void 跨线程数数()
{
for(int i = 0 ; i < 20 ; i++)
{
if(myTextBox.InvokeRequired)//如果控件的 Handle 是在与调用线程不同的线程上创建的(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false
{
myTextBox.BeginInvoke (跨线程委托变量名 , 跨线程数字增加 ());
Thread.Sleep (2000);
}
else
{
跨线程委托方法 (i.ToString ());
}
}
}
private string 跨线程数字增加()
{
Pint = Pint + 1;
return Pint.ToString ();
}
private void 跨线程委托方法( string text )
{
myTextBox.Text += text + System.Environment.NewLine;
myTextBox.Refresh ();
}
#endregion 跨线程调用
#region 进度条
private delegate void 进度条委托( int myInt );
private 进度条委托 进度条委托变量名;
private void button进度条_Click( object sender , EventArgs e )
{
进度条委托变量名 = new 进度条委托 (进度条委托方法);
Thread thread = new Thread (new ThreadStart (进度条数数));
thread.Start ();
}
private void 进度条数数()
{
while(true)
{
if(this.InvokeRequired)
{
if(Pint > 20)
{
MessageBox.Show ("进度条最大了");
break;
}
else
{
this.BeginInvoke (进度条委托变量名 , Pint++);
}
}
else
{
MessageBox.Show ("在同一线程");
break;
}
Thread.Sleep (200);
}
}
private void 进度条委托方法( int myInt )
{
label进度条最大数.Text = myInt.ToString ();
myTextBox.Text = myInt.ToString ();
myTextBox.Refresh ();
label进度条最大数.Refresh ();
progressBar1.Value = myInt;
progressBar1.Refresh ();
}
#endregion 进度条