簡體   English   中英

為什么在執行我的代碼 (XmlDocument.Load) 之前設置斷點會阻止異常?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM