Приложение для Магазина Windows, как непрерывно читать из сокета TCP и обновлять пользовательский интерфейс при получении "\n"

Я работаю с этим кодом, чтобы общаться с другой программой через TCP, которая действует как сервер. Мое приложение также является приложением Магазина Windows, и я только что добавил 3 метода в свой код. Сервер сделан не мной, я никак не могу его изменить. Подключение и отправка сообщений работает нормально. После того, как я дал конкретную команду серверу, он отправляет обратно непрерывный поток, состоящий из строк, оканчивающихся на "\r\n", чтобы увидеть, когда заканчивается сообщение, что-то вроде этого: "string1\r\nstring2\r\n" и так далее, пока есть связь с ним. Обратите внимание, что отправка команды работает, потому что я получаю визуальный ответ от сервера.

Я не могу найти способ отображения отдельных строк в пользовательском интерфейсе моего приложения, я думаю, что моя проблема заключается в read() метод, потому что поток никогда не "потребляет":

public async Task<String> read() 
    {
        DataReader reader;
        StringBuilder strBuilder;

        using (reader = new DataReader(socket.InputStream))
        {
            strBuilder = new StringBuilder();

            // Set the DataReader to only wait for available data (so that we don't have to know the data size)
            reader.InputStreamOptions = Windows.Storage.Streams.InputStreamOptions.Partial;
            // The encoding and byte order need to match the settings of the writer we previously used.
            reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
            reader.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;

            // Send the contents of the writer to the backing stream. 
            // Get the size of the buffer that has not been read.
            await reader.LoadAsync(256);

            // Keep reading until we consume the complete stream.
            while (reader.UnconsumedBufferLength > 0)
            {
                strBuilder.Append(reader.ReadString(reader.UnconsumedBufferLength));
                await reader.LoadAsync(256);
            }

            reader.DetachStream();
            return strBuilder.ToString();
        }
    }

У меня есть событие на кнопке, которая вызывает send() имея параметр строковую команду, которую я хочу отправить. Сначала я просто попробовал textBox.Text = await read(); после вызова send() метод, ничего не появилось в textBox, Затем я попытался сделать read() способ не вернуть ничего и положить textBox.Text = strBuilder.ToString(); в разных местах внутри read(), Наконец, я обнаружил, если положить его внутрь while (reader.UnconsumedBufferLength > 0) после strBuilder.Append(reader.ReadString(reader.UnconsumedBufferLength)); textBox обновляется, хотя я не уверен, что строки действительно отображаются правильно, но мой пользовательский интерфейс перестает отвечать на запросы, возможно потому, что он застрял в while петля. Я искал в Интернете несколько примеров, в том числе о том, как сделать это в отдельном потоке, к сожалению, мой опыт начального уровня, и это лучшее, что я мог сделать, я не знаю, как адаптировать код дальше. Я надеюсь, что я был достаточно откровенен. Кроме того, я не против, если вы покажете мне другой, лучший способ обновления интерфейса

0 ответов

Другие вопросы по тегам