日期:2014-05-18  浏览次数:21096 次

委托怎么写?线程
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
            {