1

我試圖調試一些異步代碼,當我嘗試逐步執行的調試代碼行,一切直到它到達18號線在下面的代碼片段去罰款。運行該行後,調試器停止並退出調試模式。是否有一種特殊的方式來調試我缺少的異步程序,或者在代碼中有不正確的東西?爲什麼Visual Studio在此語句後退出調試模式?

1. private static void ReadAsynchronously(IAsyncResult ar) 
2.  { 
3.   StateObject state = (StateObject)ar.AsyncState; 
4.   //Data buffer for incoming data 
5.   byte[] bytes = new byte[1024]; 
6. 
7.   Socket readHandler = state.workSocket; 
8.    
9.   //Flag variable for identifying the End of Character from the read message 
10.   bool pFlag = false; 
11. 
12.   //String variable for store the reading data from the client socket 
13.   string content = string.Empty; 
14.   string data = string.Empty; 
15. 
16. 
17.   // Read data from the client socket. 
18.   int read = readHandler.EndReceive(ar); 
19. 
20.   if (read > 0) 
21.   { 
        ........ 
+0

的EndReceive()調用將拋出一個異常,以指示異步操作失敗。不知道爲什麼調試器不會告訴你。查看輸出窗口中的「第一次機會」異常通知。使用Debug + Exceptions,Thrown複選框強制停止。 –

+0

哦,對不起,沒看到我的回答之前,您的評論,無意劫持你的榮譽 – eFloh

回答

0

你可能會錯過在EndRead通話異常,請嘗試使用catch塊,並檢查:

int read; 
try 
{ 
    read = readHandler.EndReceive(ar); 
} 
catch (Exception ex) 
{ 
    System.Diagnostics.Debug.WriteLine(ex.ToString()); //ADD BREAKPOINT HERE 
} 
+0

你釘它。我不小心關閉了位於BeginRecieve函數的finally塊中的WorkSocket。由於套接字被丟棄,它拋出了一個未被捕獲的錯誤,導致調試器分離。 – CheckRaise

0

每次你跨過一行代碼調試器時,讓該行代碼運行然後返回到休息狀態。在第18行中發生的事情是,這行代碼需要很長時間才能運行,所以看起來調試器已經停止了調試,但它沒有:調試器將在該行代碼最終完成時中斷。

您需要調查爲什麼操作未完成或它爲什麼這麼長時間服用。 EndReceive方法將阻塞直到數據可用,因此最可能的原因是連接另一端的進程並未實際發送任何數據。

編輯:如果發送的代碼是您自己的,並且您正在使用StreamWriter,那麼請確保在寫入代碼後致電Flush()。或者,您可以通過AutoFlush屬性啓用自動沖水功能。

+0

我猜「與退出調試模式」,在問題裏指的應用程序終止,但你可能會在這裏... @OP:是VS在中斷或停止狀態之後? – eFloh

+0

@eFloh我對應用程序是停止還是處於* running *狀態更感興趣。我們從OPs的描述中知道它不處於休息狀態。當然 –

+0

,有一個錯誤在我的手指/腦接口 – eFloh

相關問題