Обычно, когда отладчик подключен, Visual Studio 2010 останавливается при необработанном исключении, даже если в диалоговом окне Исключения нет отметки для типа исключения в столбце "Брошенный". Ключевое слово здесь необработанное; указанный диалог относится только к обработанным исключениям.
Однако в следующем минимальном примере Visual Studio 2010 не останавливается на исключение для меня, даже если оно появляется в окне Immediate как исключение из первого шанса:
РЕДАКТИРОВАТЬ: Первый минимальный пример, который я опубликовал, был исправлен первым ответом, который я получил, но, к сожалению, следующий пример все еще обнаруживает проблему:
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.Start
. Я могу только воспроизвести проблему, бросив внутрь обратного вызова BeginReceive
.)