Мой интерфейс отстает при попытке подключения к сокету? - PullRequest
0 голосов
/ 14 мая 2019

Когда я пытаюсь подключиться к сокету моего сервера, мой интерфейс отстает, и перехват не запускается.

Вот мой код:

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 Ответ

1 голос
/ 14 мая 2019

Проще говоря, все это нужно делать асинхронно.Ваш пользовательский интерфейс зависает (не отстает - отставание подразумевает, что он идет медленно, но он движется, он просто отстает), потому что поток, который обычно будет занят рисованием пользовательского интерфейса и продолжает его отвечать, ожидает подключения для подключения, а затем отправляети получение данных

Там, где вы сказали Connect, Send и Receive, они должны быть ConnectAsync, SendAsync и ReceiveAsync.Вам нужно будет внести другие изменения в код, чтобы использовать асинхронные методы, такие как пометка собственных методов как асинхронных и использование ключевого слова await перед вызовами методов, которые могут блокировать.

При переключении на использование xAsync методовкогда ваш пользовательский интерфейс будет заблокирован в ожидании завершения соединения или передачи данных, код приостановит выполнение своих действий и вернется к рисованию пользовательского интерфейса.Когда данные доступны и т. Д., Они будут отозваны до того места, где они остановились, и продолжат обработку

Я также рекомендую вам не пытаться вызывать SendLoop вне проверки, является ли сокетсвязной ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...