@Senture

Зависание сцены во время получения сообщения с сервера, что делать?

Здравствуйте! Есть вот такой скрипт в Unity:
Script
internal bool connected = false;
    internal Socket socket;
    internal Dictionary<string, string> data= new Dictionary<string, string>();

    void FixedUpdate()
    {
        if (!connected)
            return;

        try
        {
            int bytes = 0; // Счетчик полученных байт с сервера
            byte[] buffer = new byte[1024]; // Массив байт, для данных полученых с сервера

            StringBuilder builder = new StringBuilder();

            do
            {
                bytes = socket.Receive(buffer); // Прием данных от сервера !!! вот из за этой строчки вся сцена виснет, и я не знаю, как сделать получение сообщений с сервера асинхронным, что бы, сцена не висла.
                builder.Append(Encoding.UTF8.GetString(buffer, 0, bytes)); // Строим сообщение из полученных данных ( массива байт )
            }
            while (socket.Available > 0);

            string[] allInfo = builder.ToString().Split(';');
            for (int i = 0; i < allInfo.Length; i++)
            {
                string[] info = allInfo[i].Split('|');
                data.Add(info[0], info[1] + '|' + info[2] + '|' + info[3]);
            }
        }
        catch (Exception ex)
        {
            Debug.Log("Error in Helper.FixedUpdate: " + ex.Message);
        }
    }



Вот на этой строчке виснет вся сцена.
bytes = socket.Receive(buffer); // Прием данных от сервера !!! вот из за этой строчки вся сцена виснет, и я не знаю, как сделать получение сообщений с сервера асинхронным, что бы, сцена не висла.


Кто знает, что с этим можно сделать, подскажите пожалуйста как решить данную задачу.
P.S. Всем огромное спасибо!!
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
@Senture Автор вопроса
Решил проблему так:
void Start()
    {
        Thread t = new Thread(ReceiveData);
        t.Start();
    }

    private void ReceiveData()
    {
        while (true)
        {
            if (connected)
            {
                Debug.Log("Run");
                try
                {
                    int bytes = 0; // Счетчик полученных байт с сервера
                    byte[] buffer = new byte[1024]; // Массив байт, для данных полученных с сервера

                    StringBuilder builder = new StringBuilder();

                    do
                    {
                        bytes = socket.Receive(buffer); // Прием данных от сервера
                        builder.Append(Encoding.UTF8.GetString(buffer, 0, bytes)); // Строим сообщение из полученных данных ( массива байт )
                    }
                    while (socket.Available > 0);

                    string[] allInfo = builder.ToString().Split(';');
                    for (int i = 0; i < allInfo.Length; i++)
                    {
                        string[] info = allInfo[i].Split('|');

                        Action action = () => { data.Add(info[0], info[1] + '|' + info[2] + '|' + info[3]); };
                        action.Invoke(); 
                    }
                }
                catch (Exception ex)
                {
                    Debug.Log("Error in Helper.FixedUpdate: " + ex.Message);
                }
            }
        }
    }

Все прекрасно работает =)
Всем огромное спасибо!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
freeExec
@freeExec
Участник OpenStreetMap
Где вы взяли этот скрипт, там просто букет классических ошибок
1) Какое отношение имеет сетевой стек в физическим тикам, чтобы его запускать в FixedUpdate
2) Зачем каждый update создавать буфер и StringBuilder

Асинхронные методы начинаются с Begin*.
Ответ написан
@p4p
Сцена зависает так как ждет поступления данных. Такие операции не выполняют в основном потоке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы