Непрерывная связь UDP приводит к GC Sweep и прекращает прием - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь связаться со встроенным сервером UDP с моего устройства Android, и при получении пакета UDP я обновляю свой интерфейс.Связь работает нормально в течение ~ 250 итераций (запрос-ответ), а затем выдает GC Sweep Major и UDP-сокет прекращает прием.Я новичок в разработке Android, и я не уверен, что реализация моего UDP-соединения выполнена правильно

Это то, что у меня есть ...

    void Initialize_UDP()
    {
        ThreadPool.QueueUserWorkItem(o => UDPCommunicator());
        update_flag = true;
    }

    void UDPCommunicator()
    {
        while (true)
        {
            if (update_flag)
            {
                try
                {
                    byte[] buffer = FrameGenerator(1, 0, true);
                    byte[] data = new byte[25];
                    CheckQuery(buffer);
                    var sender = default(IPEndPoint);
                    using (UdpClient udpClient = new UdpClient(15001))
                    {
                        udpClient.EnableBroadcast = true;
                        udpClient.Send(buffer, buffer.Length, "192.168.4.255", 15000);
                        udpClient.Client.ReceiveTimeout = 500;
                        data = udpClient.Receive(ref sender);
                        socket_active = false;
                    }
                    CheckResponse(data);
                    /*RunOnUiThread(() =>
                    {
                        Update_UI(data);
                    }); */
                }
                catch (SocketException)
                {
                    Log.Debug("Error", "Socket Error: Timeout");
                }
            }                
            Thread.Sleep(100);
        }
    }

Это ошибка, которую я получаю

09-25 14: 20: 01,795 ЦАП (7595): Ответ: 35 68 1 18 56 231 2 0 223 137 23 8 0 0 0 0 2 1 14 19 0 1 185

09-25 14: 20: 01.896 Ц / Д (7595): Запрос: 35 81 1 0 139

09-25 14: 20: 01.941 I / zygote (7595): явное одновременное копирование GC освобожден4890 (372 КБ) объектов AllocSpace, 0 (0 Б) объектов LOS, 50% свободного, 1628 КБ / 3 МБ, пауза 170 мс всего 35,511 мс

09-25 14: 20: 01,941 D / Mono (7595): мосты GC_TAR_BRIDGE21 объект 24 непрозрачных 1 цвета 21 цветовой мост 21 видимый цвет 21 внешняя ссылка 0 попадание в кэш 0 полушиток 0 отсутствие кеша 0 настройка 0,07 мс таржан 0,06 мс scc-настройка 0,06 мс сбор-внешняя ссылка 0,00 мс внешняя установка 0,00 мсочистка 0,05 мс

09-25 14: 20: 01,942 D / Mono (7595): GC_BRIDGE: завершена, работала в течение 37,27 мс

09-25 14: 20: 01,942 D / моно(7595): GC_MINOR: (Параллельное начало) время 5,32 мсек, STW 8,02 мс продвинуто 114 КБ основной размер: 848 КБ используется: 170 Кбайт размер: 17408 КБ используется: 16067 К

09-25 14: 20: 01,942 D / Mono (7595): GC_MAJOR_CONCURRENT_START: (переполнение LOS)

09-25 14: 20: 02.442 D / ошибка (7595): ошибка сокета: время ожидания 09-25 14: 20: 02.544 ЦАП (7595): запрос: 3581 1 0 139

1 Ответ

1 голос
/ 25 сентября 2019

Это слишком короткий тайм-аут.UdpClient.Client.ReceiveTimeout - время в миллисекундах.Stacktrace показывает, что между «GC_MAJOR_CONCURRENT_START: (переполнение LOS)» и «Socket Error: Timeout» прошло ровно 500 миллисекунд, поэтому это и есть причина.Решением этой проблемы является увеличение тайм-аута UDP-клиента, значение по умолчанию - «0», что означает бесконечность, и / или добавление обработки ошибок к событию тайм-аута

...