+ -
当前位置:首页 → 问答吧 → 这里的委托和invoke咋理解?

这里的委托和invoke咋理解?

时间:2011-12-24

来源:互联网

最近看一个串口助手程序,关于接收字符这一块有点不理解,就是在如何将接收到的字符传给richtextbox2.text显示出来?[code=C#][/code]delegate void SetTextCallback(string text);
  private void SetText(string text)
  {
  try
  {
  if (this.richTextBox2.InvokeRequired)
  {
  SetTextCallback d = new SetTextCallback(SetText);
  this.Invoke(d, new object[] { text });//就是这个地方不理解,不知道如何将接收到的字符传给richtextbox2.text显示出来
  }
  else
  {
  this.richTextBox2.Text += text;
  }
  }
  catch (Exception)
  {
  }
  }

  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)//串口是否收到字符,当收到字符时调用 SetText(string text);

  {
  char[] c;
  while (true)
  {
  try
  {
  if (serialPort1.IsOpen)
  {
  c = new char[serialPort1.BytesToRead];
  serialPort1.Read(c, 0, c.Length);
  if (c.Length > 0)
  {
   
  SetText(new string(c));//
   
  }
  }
  }
  catch (Exception) { }
  }
  }

作者: wantaoqian   发布时间: 2011-12-24

自己看msdn: http://msdn.microsoft.com/zh-cn/library/zyzhdc6b(v=vs.80).aspx

实际上他完全没有必要这样写。可以很简单地写:C# code
this.Invoke(delegate()
    {
        SetText(text);
    });

作者: sp1234   发布时间: 2011-12-24

使用匿名方法既可以清晰地使用 Control.Invoke。只要你将你的vs升级,及时开发.net2.0平台的程序,也一样是可以使用匿名方法、lamda表达式等等语法的。

你这里的代码,以及msdn上面的代码,都非常的繁琐和不友好。

作者: sp1234   发布时间: 2011-12-24

首先是backgroundWorker1和richtextbox2工作在不同的线程内,它调用SetText(new string(c))时同样属于backgroundWorker1的线程,此时InvokeRequired为true。
Invoke会使richtextbox2所属的窗口线程执行SetTextCallback(SetText)委托,即再次调用SetText(text),但此时是在richTextBox2所属的窗口线程内,InvokeRequired为false,进入else块。

作者: xiacheng1984   发布时间: 2011-12-24

热门下载

更多