Почему установка точки останова перед выполнением моего кода (XmlDocument.Load) предотвращает исключение? - PullRequest
0 голосов
/ 06 мая 2020

Сейчас я пытаюсь отправить XmlDocument через NetworkStream.

Клиентская сторона: отправка настраиваемого объекта типа User в поток с помощью сериализатора.

XmlSerializer serializer = new XmlSerializer(typeof(User));
XmlWriter writer = new XmlTextWriter(_tcpStream, Encoding.Unicode);
serializer.Serialize(writer, user);

На стороне сервера : Получение потока и загрузка его в документ для дальнейшей обработки.

static XmlElement ReceiveXmlElementFromClient(TcpClient client)
       {
           Console.WriteLine("Receiving Element from client...");
           XmlDocument document = new XmlDocument();

           NetworkStream ns = client.GetStream();
           Console.WriteLine("Reading buffer.");
           byte[] bRead = new byte[client.ReceiveBufferSize];
           ns.Read(bRead, 0, client.ReceiveBufferSize);


           Stream reader = new MemoryStream(buffer.ToArray());
           XmlReader r = new XmlTextReader(reader);
           document.Load(r);
           // document.Save("test.xml")
           Console.WriteLine("Element received.");
           return document.DocumentElement;
       }

Это вызывает исключение «Root элемент отсутствует».

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

Я нашел этот поток с похожей проблемой в C: Почему установка точки останова заставляет мой код работать? Исходя из того, что я понял (никогда не касался C), проблема заключалась в пустом начальном значении, аналогичном:

byte[] bRead = new byte[client.ReceiveBufferSize];

На основе что я пробовал с локальной функцией, которая возвращала byte [], а также добавляла все байты в список соответственно. Ни один из этих методов не сработал.

Еще один поток, который я нашел с объяснением, которое пришло мне в голову: Почему в Java / Eclipse установка точки останова в моем коде меняет эффект этого оператора? В одном из ответов упоминается, что в конечном итоге это поток, работающий в фоновом режиме, который не успевает завершить sh до следующего шага. Я попробовал сделать это, заставив свой поток ждать, добавив секундомер и while-l oop, который сломался через 5 se c, но напрасно.

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

1 Ответ

0 голосов
/ 27 мая 2020

Решено, я просто поместил функцию ожидания не в то место (должно быть прямо перед "Буфером чтения"). Просто нужно время, чтобы отправить все данные.

...