线程,复制,错误,SetTextCallback

时间:2013-01-09 01:23:47

标签: c# winforms multithreading

为了尝试深入了解线程,我尝试了猴子看猴子,并在MSDN上从THIS_PAGE复制(如读取和输入,而不是剪切和粘贴)。

当我这样做时,我收到以下错误

  

错误2找不到类型或命名空间名称'SetTextCallback'(您是否缺少using指令或程序集引用?)Form1.cs 385 17 ZYX987

     

错误3找不到类型或命名空间名称'SetTextCallback'(您是否缺少using指令或程序集引用?)Form1.cs 385 41 ZYX987

我在网页上向下滚动,发现很多社区评论表明每个人都有完全相同的问题,因为这个例子具有误导性。即,SetTextCallback永远不会被宣布。

这是我在盯着MSDN页面时输入的模仿版本......

private void SetText(string text)
{
    // InvokeRequired required compares the thread ID of
    // the calling thread to the thread ID of the 
    // creating thread.  If these threads are different, 
    // it returns true
    if (this.label1.InvokeRequired)                    
    {
        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.label1.Text = text;
    }
}

请有人在这里建议我应该将SetTextCallback放在我的CopyCatCode中吗?

第二个问题:声明它的语法是什么样的?

第三个问题:如果SetTextCallback是一种方法,那么它应该包含哪些内容?

我在Stack Overflow上搜索了“... SetTextCallback ...”(没有引号)并找到了一些引用,但不是这个确切的问题。希望这是属于这里的问题。谢谢你的阅读。

4 个答案:

答案 0 :(得分:10)

在您链接到的msdn页面(“How to: Make Thread-Safe Calls to Windows Forms Controls”)中向下滚动,完整的源代码列在底部。你会在那里找到定义:

    // This delegate enables asynchronous calls for setting
    // the text property on a TextBox control.
    delegate void SetTextCallback(string text);

答案 1 :(得分:3)

SetTextCallback只是一个委托,其签名与委托方法相同。

像:

public delegate void SetTextCallback(string message);

您也可以从this tutorial

中受益

答案 2 :(得分:3)

请看这个完整的例子:

// This delegate enables asynchronous calls for setting
// the text property on a TextBox control.
delegate void SetTextCallback(string text);

答案 3 :(得分:2)

我有同样的问题,这是我的解决方案

我正在阅读带有datareceived的串口,只需要把文本收到文本框,我就这样做了:

public void puerto_serie_DataReceived(object sender,
                                   System.IO.Ports.SerialDataReceivedEventArgs e)
{
  string a = this.puerto_serie.ReadLine().Trim();
  leer(a);
}
delegate void SetTextCallback(string text);
void leer(String b)
{
  if (valores.InvokeRequired)
  {
    SetTextCallback d = new SetTextCallback(leer);
    this.Invoke(d, new object[] { b });
  }
  else
  {
    valores.Text += this.puerto_serie.ReadLine().Trim()+"\n";
  }
}