[英]Why does setting a breakpoint before the execution of my code (XmlDocument.Load) prevent exception?
我目前正在嘗試通過 NetworkStream 發送 XmlDocument。
客戶端:使用序列化程序將 User 類型的自定義 object 發送到 stream。
XmlSerializer serializer = new XmlSerializer(typeof(User));
XmlWriter writer = new XmlTextWriter(_tcpStream, Encoding.Unicode);
serializer.Serialize(writer, user);
服務器端:接收 stream 並將其加載到文檔中進行進一步處理。
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;
}
這會導致“缺少根元素”異常。
但是,當我在 function 中較早放置斷點時(盡管不是在程序中較早),它按預期工作。 可以保存文檔以及提取根元素,所有這些都具有正確的格式(與客戶端相同)。
我在 C 中發現這個線程似乎有同樣的問題: 為什么設置斷點會使我的代碼工作? 根據我的理解(從未接觸過 C),問題是關於一個空的初始值,類似於:
byte[] bRead = new byte[client.ReceiveBufferSize];
基於此,我嘗試使用返回 byte[] 的本地 function,並將所有字節分別添加到列表中。 這些方法都不起作用。
我發現的另一個線程有一個讓我想到的解釋: 在 Java/Eclipse 中,為什么在我的代碼中設置斷點會改變該語句的效果? 一個答案提到它最終是一個在 bakground 中運行的線程,在下一步之前沒有時間完成。 我嘗試通過添加一個秒表和一個在 5 秒后中斷的 while 循環來讓我的線程等待,但徒勞無功。
現在我沒有想法,很困惑,如果有人能解釋斷點在做什么以及我錯過了什么,我會很高興。
解決了,我剛剛把等待 function 放在了錯誤的地方(應該在“讀取緩沖區”之前)。 發送所有數據只需要時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.