Visual Studio 2010 не останавливается на необработанном исключении внутри обратного вызова Socket.BeginReceive () - почему?

Обычно, когда отладчик подключен, Visual Studio 2010 останавливается на необработанном исключении, даже если в диалоговом окне «Исключения» нет галочки для типа исключения в столбце «Выброшено». Ключевое слово здесь unhandled; указанный диалог относится только к обработанным исключениям.

Однако в следующем минимальном примере Visual Studio 2010 для меня не останавливается на исключении, хотя оно отображается в окне Immediate Window как исключение первого шанса:

EDIT: Первый минимальный пример Я сообщил, что был исправлен первым полученным ответом, но, к сожалению, следующий пример все еще демонстрирует проблему:

using System;
using System.Net.Sockets;

namespace SocketTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var listener = new TcpListener(8080);
            listener.Start();
            AsyncCallback accepter = null;
            accepter = ar =>
            {
                var socket = listener.EndAcceptSocket(ar);
                var buffer = new byte[65536];
                AsyncCallback receiver = null;
                receiver = ar2 =>
                {
                    var bytesRead = socket.EndReceive(ar2);
                    throw new InvalidOperationException();
                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, receiver, null);
                };
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, receiver, null);
                listener.BeginAcceptSocket(accepter, null);
            };
            listener.BeginAcceptSocket(accepter, null);

            Console.WriteLine("Feel free to connect to port 8080 now.");
            Console.ReadLine();
        }
    }
}

Если вы запустите это, подключитесь к нему, запустив telnet localhost 8080 , а затем введите любой символ в telnet , надеюсь, вы увидите то, что вижу я: программа просто прерывается без уведомления.

Почему Visual Studio явно проглатывает это исключение? Могу ли я заставить его прерываться при исключении, как это обычно бывает?

(Интересно, бросание внутри обратного вызова BeginAcceptSocket действительно перехватывается, как и исключение в обычном потоке, запущенном с Thread. Запустите . Я могу воспроизвести проблему только с помощью обратного вызова BeginReceive .)

10
задан Timwi 20 November 2011 в 02:07
поделиться