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

时间:2010-11-22 09:50:36

标签: c# multithreading .net-4.0 udp

我一直在尝试将一个对象传递给我的主线程进程,但它似乎无法以我认为的方式工作。

首先我创建线程:

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)
{
}

我记得前一段时间使用Threads并且我确定它们传递数据并不是那么困难,我是以错误的方式做到这一点还是我错过了一段代码?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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