连续的UDP通信导致GC扫描并停止接收

问题描述 投票:0回答:1

我正在尝试从我的android设备与嵌入式UDP服务器进行通信,并且在收到UDP数据包后,我正在更新自己的UI。通信可以正常工作约250次迭代(查询-响应),然后弹出GC扫描主屏幕,并且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 D / A(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 D / A(7595):查询:35 81 1 0 139

09-25 14:20:01.941 I / zygote(7595):显式并发复制GC已释放4890(372KB)AllocSpace对象,0(0B)LOS对象,50%空闲,1628KB / 3MB,已暂停170us,总计35.511ms] >

09-25 14:20:01.941 D / Mono(7595):GC_TAR_BRIDGE跨接21个对象24不透明1种颜色21种跨接21种颜色-可见21外部参照0缓存命中0缓存半迷糊0缓存缺失0设置0.07 ms tarjan 0.06ms scc设置0.06ms collect-xref 0.00ms xref-setup 0.00ms清理0.05ms

09-25 14:20:01.942 D / Mono(7595):GC_BRIDGE:已完成,运行了37.27ms

09-25 14:20:01.942 D / Mono(7595):GC_MINOR:(并发启动)时间5.32ms,stw 8.02ms提升了114K主要大小:使用848K:170K丢失大小:17408K使用中:16067K

09-25 14:20:01.942 D /单声道(7595):GC_MAJOR_CONCURRENT_START:(LOS溢出)

09-25 14:20:02.442 D /错误(7595):套接字错误:超时09-25 14:20:02.544 D / A(7595):查询:35 81 1 0 139

我正在尝试从我的android设备与嵌入式UDP服务器进行通信,并且在收到UDP数据包后,我正在更新自己的UI。通讯可以正常进行约250次迭代(查询-响应)...

c# xamarin.android android-asynctask udp threadpool
1个回答
0
投票

这是超时时间太短的情况。 UdpClient.Client.ReceiveTimeout是以毫秒为单位的时间。 Stacktrace显示“ GC_MAJOR_CONCURRENT_START:(LOS溢出)”和“套接字错误:超时”之间恰好花费了500毫秒,因此这就是原因。解决方案是增加UDP客户端的超时,默认值为“ 0”,这意味着无限,和/或向超时事件添加错误处理

© www.soinside.com 2019 - 2024. All rights reserved.