У меня есть класс, который содержит метод для приема данных UDP в отдельном потоке. Я делаю это, чтобы избежать того, чтобы основное приложение (которое работает в Unity3D) не задерживалось.Обработка полученных данных UDP в другом потоке в C#
Мне нужно передать данные, полученные в отдельном потоке, в другой класс, который работает в исходном потоке и, таким образом, может взаимодействовать с 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 (данные) ** + некоторые ** Invoke **? Извините, если я что-то упустил ... Есть что-то особенное в Unity? – Pragmateek
@Pragmateek Как бы я вызвал метод? Мои знания о потоках довольно ограничены. –
Единственная проблема, с которой вы могли столкнуться, это обновление некоторых компонентов пользовательского интерфейса с ** привязкой к потоку **, для этого требуется специальный метод для перевода вашей обработки в очередь потоков пользовательского интерфейса, в противном случае это так же просто, как вызов метода: 'byte [ ] data = (m_UDPClient.Receive (ref anyIP)); networkController.OnNewData (data); ' – Pragmateek