【问题标题】:My UI lags while trying to connect to a socket?我的 UI 在尝试连接到套接字时滞后?
【发布时间】:2019-05-14 19:06:32
【问题描述】:

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

这是我的代码:

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);
}

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

【问题讨论】:

    标签: c# sockets xamarin


    【解决方案1】:

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

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

    通过切换到使用 xAsync 方法,当您的 UI 将被阻塞等待连接完成或数据传输时,代码将暂停正在执行的操作并返回绘制 UI。当数据可用等时,会回调到上次中断的地方,继续处理

    我还建议您不要尝试在检查套接字是否已连接之外调用SendLoop..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多