Обычно, когда отладчик подключен, 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
.)