为啥在执行我的代码 (XmlDocument.Load) 之前设置断点会阻止异常?

Posted

技术标签:

【中文标题】为啥在执行我的代码 (XmlDocument.Load) 之前设置断点会阻止异常?【英文标题】:Why does setting a breakpoint before the execution of my code (XmlDocument.Load) prevent exception?为什么在执行我的代码 (XmlDocument.Load) 之前设置断点会阻止异常? 【发布时间】:2020-08-21 09:10:41 【问题描述】:

我目前正在尝试通过 NetworkStream 发送 XmlDocument。

客户端: 使用序列化程序将 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;
       

这会导致“缺少根元素”异常。

但是,当我在函数的前面放置断点时(尽管不是在程序的前面),它会按预期工作。可以保存文档以及提取根元素,所有这些都具有正确的格式(与客户端相同)。

我发现这个线程在 C:Why does setting a breakpoint make my code work? 中似乎有同样的问题 根据我的理解(从未接触过 C),问题是关于一个空的初始值,类似于:

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

基于此,我尝试使用返回 byte[] 的本地函数,并将所有字节分别添加到列表中。这些方法都不起作用。

我发现的另一个线程有一个让我想到的解释: In Java/Eclipse, why does setting a breakpoint in my code alter the effect of that statement? 一个答案提到它最终是一个在 bakground 中运行的线程,在下一步之前没有时间完成。我尝试通过添加一个秒表和一个在 5 秒后中断的 while 循环来让我的线程等待,但徒劳无功。

现在我没有想法,很困惑,如果有人能解释断点在做什么以及我缺少什么,我会非常高兴。

【问题讨论】:

您忽略了ns.Read(bRead, 0, client.ReceiveBufferSize); 的返回值,它为您提供了实际读取的字节数。您可能正在尝试使用不完整的缓冲区进行反序列化。您不需要使用中间内存流。直接将网络流 (ns) 馈送到您的 XmlTextReader。 【参考方案1】:

解决了,我只是把等待函数放错了地方(应该在“读取缓冲区”之前)。发送所有数据只是需要时间。

【讨论】:

以上是关于为啥在执行我的代码 (XmlDocument.Load) 之前设置断点会阻止异常?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的代码不能在二叉搜索树中正确执行预排序?

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?

React Native 为啥我的代码在完成任务之前执行? Promise.all().then() 异步问题

为啥我的代码会执行双重转场?

为啥我的防病毒软件阻止我的代码执行...?

为啥重新执行我的多线程代码后输出不一样?