委托怎么写?线程
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (CommmandString != "wait")
{
if (CurrentDataMode == DataMode.Text)
{
string data = comport.ReadExisting();
if (data.Substring(0,2) == "OK")
{
label1.Text = data.Substring(2,2); CurrentDataMode = DataMode.Hex;
SendData();
}
}
else
{
int bytes = comport.BytesToRead;
byte[] buffer = new byte[bytes];
comport.Read(buffer, 0, bytes);
}
}
}
线程间操作无效: 从不是创建控件“label1”的线程访问它。
这该怎么搞!
[解决办法]
this.Invoke((MethodInvoker)delegate {label1.Text = data.Substring(2,2);});
[解决办法]
线程中不能直接控制窗体控件,得做同步。
参考如下代码:
- C# code
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不需要自己去申明用系统的就可以了。
引用伴水的代码:
- C# code
//通用写法 public void DoWork1() { Thread.Sleep(5000); if (this.InvokeRequired) { Invoke(new System.Windows.Forms.MethodInvoker(DoWork1)); } else { button1.Enabled = true; } } //匿名方法 public void DoWork2() { Thread.Sleep(5000); Invoke(new System.Windows.Forms.MethodInvoker(delegate() { this.button1.Enabled = true; })); }
[解决办法]
[解决办法]
[解决办法]
脚印
[解决办法]
使用异步委托,楼主可以参考一下这里,
http://blog.csdn.net/zhzuo/archive/2004/06/15/22038.aspx
http://blog.csdn.net/zhzuo/archive/2004/06/10/22037.aspx
如果是长时间的处理建议使用BackgroundWorker组件
[解决办法]
通常做法:
- C# code
delegate void myDelegate(string s);private void SetLabelText(string s){ if(label1.InvokeRequired) { myDelegate d = new myDelegate(SetLabelText); this.invoke(d,new object[]{s}); } else { label1.Text = s; }}