尝试连接到套接字时我的UI滞后?

时间:2019-05-14 10:12:23

标签: c# sockets xamarin

当我尝试连接到服务器套接字时,我的界面滞后,并且捕获没有运行。

这是我的代码:

protected void OnButtonClicked(object sender, EventArgs args)
{
    if (!clientSocket.Connected)
    {
        try
        {
            clientSocket.Connect("172.20.10.4", 100);
        }
        catch (SocketException)
        {
            gettext.Text = "Couldn't Connect";
        }
    }
    SendLoop();
}

private void SendLoop()
{
    gettext.Text = "get ivi type";
    string req = gettext.Text;
    byte[] buffer = Encoding.ASCII.GetBytes(req);
    clientSocket.Send(buffer);
    byte[] BuffRec = new byte[1024];
    int rec = clientSocket.Receive(BuffRec);
    byte[] data = new byte[rec];
    Array.Copy(BuffRec, data, rec);
    gettext.Text =  Encoding.ASCII.GetString(data);
}

因此,我想在未连接到套接字时显示异常消息。

1 个答案:

答案 0 :(得分:1)

简单地说,您需要异步执行所有这些操作。您的UI冻结(不是滞后-滞后意味着它正在缓慢运行,但正在移动,只落后了一段时间),因为通常会忙于绘制UI并保持其响应的线程正在等待连接,然后发送和接收数据

在您说过ConnectSendReceive的地方,这些分别是ConnectAsyncSendAsyncReceiveAsync。您需要进行其他代码更改才能使用异步方法,例如将自己的方法标记为异步,并在可能阻止的方法调用之前使用await关键字。

通过切换为使用xAsync方法,当您的UI即将阻塞以等待连接完成或数据传输时,代码将暂停其操作并返回绘制UI 。当有可用数据等时,它将被调回中断的位置,并进行处理

我还建议您不要在检查插座是否已连接的情况下尝试致电SendLoop