Приложение для Магазина 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
петля. Я искал в Интернете несколько примеров, в том числе о том, как сделать это в отдельном потоке, к сожалению, мой опыт начального уровня, и это лучшее, что я мог сделать, я не знаю, как адаптировать код дальше. Я надеюсь, что я был достаточно откровенен. Кроме того, я не против, если вы покажете мне другой, лучший способ обновления интерфейса