Почему Visual Studio выходит из режима отладки после этого оператора? - PullRequest
1 голос
/ 12 декабря 2011

Я пытаюсь отладить некоторый асинхронный код, и когда я пытаюсь пройтись по строкам кода в отладчике, все идет хорошо, пока не достигнет строки 18 в фрагменте ниже.После запуска этой строки отладчик останавливается и VS выходит из режима отладки.Есть ли какой-то конкретный способ отладки асинхронной программы, который мне не хватает, или в коде есть что-то неправильное?

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.            {
                   ........

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

Каждый раз, когда вы пересекаете строку кода, отладчик запускает эту строку кода, а затем возвращает вас в состояние прерывания.В строке 18 происходит то, что выполнение строки кода занимает много времени, поэтому кажется, что отладчик прекратил отладку, но этого не произошло: отладчик прервется, если и когда эта строка кода в конечном итоге завершится.

Вам необходимо выяснить, почему эта операция не завершается или почему она занимает так много времени.Метод EndReceive блокируется до тех пор, пока данные не станут доступны, поэтому наиболее вероятной причиной является то, что процесс на другом конце соединения фактически не отправил никаких данных.

Редактировать: если код выполняетотправка является вашей собственной, и вы используете StreamWriter, после чего убедитесь, что вы позвонили Flush() после записи в нее.В качестве альтернативы вы можете включить автоматическую промывку через свойство AutoFlush.

0 голосов
/ 12 декабря 2011

Возможно, вы пропустили исключение в вызове EndRead, попробуйте использовать блок catch и проверьте:

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