代码之家  ›  专栏  ›  技术社区  ›  Jamie Keeling

将对象传递到线程失败-C#

  •  4
  • Jamie Keeling  · 技术社区  · 14 年前

    我一直试图将一个对象传递给我的主线程进程,但它似乎不会像我想象的那样工作。

    首先我创建线程:

    Thread thrUDP;
    

    然后我创建将用于存储所需数据的对象:

    UDPData udpData;
    

    现在,我用正确的数据初始化对象,设置新线程并用传入start()方法的对象启动它:

    udpData = new UDPData("224.5.6.7", "5000", "0", "2");
    
                thrUDP = new Thread(new ParameterizedThreadStart(SendStatus));
                thrUDP.Start(udpData);
    

    这是我想开始的方法:

    private void SendStatus(UDPData data)
    {
    }
    

    我记得有一段时间我使用了线程,我确信它们不会很难将数据传递给其他人,我这样做是错误的,还是只是缺少了一段代码?

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  3
  •   Ani    14 年前

    这个 ParameterizedThreadStart 委托声明为:

    public delegate void ParameterizedThreadStart(object obj);
    

    显然,这个委托与您方法的签名不兼容,并且没有直接的方法来获取 System.Threading.Thread 使用任意委托类型。

    您的一个选择是为该方法使用兼容的签名,并根据需要进行转换:

    private void SendStatus(object obj)
    {
       UDPData data = (UDPData)obj;
       ...
    }
    

    另一种选择是将问题提交给C编译器,创建一个闭包。例如:

    new Thread(() => SendStatus(udpData)).Start();
    

    请注意,这使用 ThreadStart 代之以委派。另外,在随后修改 udpData 本地的,因为它被捕获了。

    或者,如果不介意使用线程池而不是生成自己的线程,可以使用异步委托。例如:

    Action<UDPData> action = SendStatus;
    action.BeginInvoke(udpData, action.EndInvoke, null);
    
        2
  •  1
  •   Stefan P.    14 年前
    private void SendStatus(object data)
    {
     UDPData myData = (UDPData) data;
    }