【发布时间】:2013-06-19 13:51:32
【问题描述】:
我有一个类,它包含一个在单独的线程中接收 UDP 数据的方法。我这样做是为了避免主应用程序(在 Unity3D 中运行)停止。
我需要将在单独线程中接收到的数据传递给另一个类,该类在原始线程上运行,因此能够与 Unity3D 交互。
UDPReceiver 大致如下所示:
public class UDPReciever {
//...
public UDPReciever() {
m_Port = 12345;
m_Worker = new Thread(new ThreadStart(recvData));
m_Worker.IsBackground = true;
m_Worker.Start();
}
void recvData() {
m_UDPClient = new UdpClient(m_Port);
while (true) {
try {
IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
byte[] data = (m_UDPClient.Receive(ref anyIP));
// TODO: Hand 'data' to NetworkController class (running in the original thread) for processing
} catch (Exception err) {
print(err.ToString());
}
}
}
}
这大致就是 NetworkController 类需要的样子。理想情况下,每次接收到带有作为参数传递的数据的新数据包时都会调用“OnNewData”方法。
public class NetworkController {
//...
void OnNewData(pData) {
// Process the data in this thread
}
}
我将如何实现这一目标?提前致谢。
【问题讨论】:
-
为什么不简单地:OnNewData(data) + 一些Invoke?抱歉,如果我遗漏了什么……Unity 有什么特别之处吗?
-
@Pragmateek 我将如何调用该方法?我的线程知识非常有限。
-
您可能遇到的唯一问题是使用 线程关联 更新某些 UI 组件,这需要使用特殊方法将您的处理推入 UI 线程队列,否则这是就像调用方法一样简单:
byte[] data = (m_UDPClient.Receive(ref anyIP)); networkController.OnNewData(data); -
这不会还在同一个子线程中运行吗? NetworkController 应该和 UDPReceiver 在同一个线程中运行,而不是 UDPReceiver 启动的子线程。
-
你为什么要这么做? :) 正如我所说,您想要使用特定线程的唯一原因之一是线程关联。试一试,检查一切正常。 :)
标签: c# multithreading udp unity3d