日期:2014-05-18 浏览次数:21082 次
using System.Threading; public void DoWork() { Thread.Sleep(5000); Invoke(new EventHandler(DoInvoke)); } private void DoInvoke(object sender, EventArgs e) { button1.Enabled = true; } private void button1_Click(object sender, EventArgs e) { button1.Enabled = false; Thread vThread = new Thread(new ThreadStart(DoWork)); vThread.Start(); }
------解决方案--------------------
俺们老师说,要用到Invoke线称安全
------解决方案--------------------
下面是我以前做过的一段代码,楼主可以参考一下:
delegate void deleg();//建代理(委托),注意的是:代理的返回值类型以及参数必须与被代理的方法的一致
public void search()
{
while (true)
{
search2();//不要把search2()方法的方法体直接放到这里
//如果放这里了,就会用到deleg d = new deleg(search),这样的话就会多次进行while死循环
Thread.Sleep(5000);//设置线程挂起时间5s
}
}
public void search2()
{
if (dgvData.InvokeRequired)//判断创建控件dgvData的线程是否与当前线程处于同一线程,若不是,返回true
//若没在同一线程,就不能对dgvData控件进行操作
{
deleg d = new deleg(search2);//设置代理,用d代理search2
dgvData.Invoke(d);//将该代理invoke到创建控件dgvData的线程中
//注意:如果被代理方法有参数,则需要在这里传参。Invoke(d,参数1,参数2,...)
}
else
{
string str = this.txtSID.Text.Trim(); //
Service1SoapClient bc = new Service1SoapClient(); //
DataTable dtData = bc.Search(str);//获取查询结果 //这段代码如果放到if前面的话就做了许多无用功。因为只有
//执行else的时候才需要查询出来的结果,并对其进行绑定。
dgvData.DataSource = dtData;//绑定
}
}
private void button8_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(search));//创建一个新的线程来执行search方法
t.Start();//启动该线程
}
------解决方案--------------------
推荐两个优雅的Invoke写法,另外delegate不需要自己去申明用系统的就可以了。
引用伴水的代码:
//通用写法 public void DoWork1() { Thread.Sleep(5000); if (this.InvokeRequired) { Invoke(new System.Windows.Forms.MethodInvoker(DoWork1)); } else {