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

将对象传递到线程失败-C#,c#,multithreading,.net-4.0,udp,C#,Multithreading,.net 4.0,Udp,我一直在尝试将一个对象传递给我的主线程进程,但它似乎无法以我认为的方式工作 首先,我创建线程: Thread thrUDP; 然后创建用于存储所需数据的对象: UDPData udpData; 现在,我使用正确的数据初始化对象,设置新线程,并使用传入start()方法的对象启动它: 这是我希望开始的方法: private void SendStatus(UDPData data) { } 我记得不久前使用过线程,我确信它们传递数据并不是那么困难,我这样做是错误的还是只是缺少了一段代码 谢谢

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

首先,我创建线程:

Thread thrUDP;
然后创建用于存储所需数据的对象:

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

这是我希望开始的方法:

private void SendStatus(UDPData data)
{
}
我记得不久前使用过线程,我确信它们传递数据并不是那么困难,我这样做是错误的还是只是缺少了一段代码

谢谢

委托声明为:

public delegate void ParameterizedThreadStart(object obj);
显然,此委托与方法的签名不兼容,并且没有直接的方法获得
System.Threading.Thread
来处理任意委托类型

您的选择之一是为方法使用兼容的签名,并根据需要强制转换:

private void SendStatus(object obj)
{
   UDPData data = (UDPData)obj;
   ...
}
另一种选择是将问题推给C#编译器,创建一个闭包。例如:

new Thread(() => SendStatus(udpData)).Start();
Action<UDPData> action = SendStatus;
action.BeginInvoke(udpData, action.EndInvoke, null);
请注意,这将使用
ThreadStart
委托。此外,由于捕获了
udpData
local,因此在随后修改时应小心

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

new Thread(() => SendStatus(udpData)).Start();
Action<UDPData> action = SendStatus;
action.BeginInvoke(udpData, action.EndInvoke, null);
Action-Action=SendStatus;
action.BeginInvoke(udpData,action.EndInvoke,null);

Ahh,所以我只需要更改参数类型,然后将其转换为方法中的正确类型!谢谢=]我不同意-通常类应该在其内部创建新线程-如果同步变得复杂,则从外部创建线程是从我的pov中创建DeMaster的一个方法。@weismat:你所说的“内部线程”到底是什么意思?如果使用静态方法,则创建外部线程是可以的,如果调用另一个类的方法,那么最好在另一个类内部而不是外部调用线程。