为什么在执行我的代码(XmlDocument.Load)之前设置一个断点可以防止异常?

问题描述 投票:0回答:1

我目前正在尝试通过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;
       }

这导致了 "Root element is missing "的异常。

然而,当我在函数的早期(虽然不是在程序的早期)放置一个断点时,它就会像预期的那样工作。文档可以保存,也可以提取根元素,所有的格式都是正确的(和客户端一样)。

我发现这个帖子在C语言中似乎也有同样的问题。为什么设置一个断点能让我的代码工作?根据我的理解(从未接触过C语言),这个问题是关于一个类似于空的初始值。

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

基于这一点,我尝试了一个返回字节[]的本地函数,以及将所有字节分别添加到一个列表中。这些方法都不起作用。

我又找到了一个帖子,其中有一个解释让我想到了。在JavaEclipse中,为什么在我的代码中设置一个断点会改变该语句的效果? 其中一个答案提到,最终是一个线程在bakground中运行,没有时间在下一步之前完成。我试过这个我的让我的线程等待的方法是加一个秒表和一个5秒后断点的while-loop,但是徒劳无功。

现在我没有办法了,很困惑,如果有人能解释一下断点是做什么的,我错过了什么,我会非常高兴。

c# xml breakpoints xmldocument networkstream
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.