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

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

我记得不久前使用过线程,我确信将数据传递给它们并没有那么困难,我这样做是错误的方式还是我只是遗漏了一段代码?

谢谢!

最佳答案

ParameterizedThreadStart委托(delegate)声明为:

public delegate void ParameterizedThreadStart(object obj);

显然,此委托(delegate)与您的方法签名不兼容,并且没有直接的方法让 System.Threading.Thread 与任意委托(delegate)类型一起工作。

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

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

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

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

请注意,这使用了 ThreadStart 委托(delegate)。此外,您在随后修改本地 udpData 时应该小心,因为它已被捕获。

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

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

关于c# - 将对象传递给线程失败 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4244121/

相关文章:

c# - 将 LINQ 查询结果转换为 int

c# - 使用配置元素集合 c# 实现自定义部分

c# - 生成随机字符串

c# - 用于开发皮肤应用程序的最佳框架是什么?

超过线程池 9 和排队任务 128 时,android 应用程序崩溃

c# - 抛出 WebException 的代码在 .NET 3.5 中有效,但在 4.0 中无效

ios - 如何执行等待动画完成的锁?

c# - 如果 API 已经是多线程的,您是否需要对调用者进行多线程处理? ASP.Net MVC

c# - 强制 Task<T> 到不同的核心?

c# - 如何打开Outlook新邮件窗口c#