首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

委托如何写?线程

2011-12-28 
委托怎么写?线程private void port_DataReceived(object sender, SerialDataReceivedEventArgs e){if (Com

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


[解决办法]

探讨
推荐两个优雅的Invoke写法,另外delegate不需要自己去申明用系统的就可以了。
引用伴水的代码:

C# code//通用写法
public void DoWork1()
{
Thread.Sleep(5000);
if (this.InvokeRequired)
{
Invoke(new System.Windows.Forms.MethodInvoker(DoWork1));
}
else
{
button1.Enabled =…

[解决办法]
探讨
线程中不能直接控制窗体控件,得做同步。
参考如下代码:

C# codeusing 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…

[解决办法]
脚印
[解决办法]
使用异步委托,楼主可以参考一下这里,

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;   }} 

热点排行