Когда я компилирую этот код на компьютере с установленными Windows 7 Ultimate и .NET 4, он работает просто отлично, но когда я пытаюсь выполнить его на компьютере с установленными Windows 8 RTM и .NET 4.5, событие Complete никогда не срабатывает.
class Program
{
private static Socket _Socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
private static void Main(string[] args)
{
_Socket.Bind(new IPEndPoint(IPAddress.Any, 5012));
_Socket.Listen(100);
var arguments = new SocketAsyncEventArgs();
arguments.Completed += OnAccepted;
Accept(arguments);
Console.ReadLine();
}
private static void Accept(SocketAsyncEventArgs args)
{
args.AcceptSocket = null;
if (!_Socket.AcceptAsync(args))
OnAccepted(null, args);
}
private static void OnAccepted(object sender, SocketAsyncEventArgs e)
{
Console.WriteLine("Accepted.");
Accept(e);
}
}
Здесь интересно, если я поставлю точку останова на эту строку и отлажу ее:
var arguments = new SocketAsyncEventArgs();
Подключите этот сервер с помощью Hercules до продолжая выполнение, это работает как шарм. Я делаю это в начале, а затем волшебным образом вызывается OnAccepted и пишет «Принято». в консоль при каждом подключении. Я использую тот же код и ту же программу (Hercules) на машине с Windows 7 и .NET 4, но она всегда работает.
- Я делаю что-то неправильно?
- Если нет, то является ли это известной ошибкой моей ОС или .NET Framework версии 4.5?
- Кто-нибудь может воспроизвести это?
Изменить: обе операционные системы 64-разрядные.
Изменить 2: я сообщил об этом как об ошибке в Microsoft Connect, здесь.
Редактировать 3: найти обходной путь и опубликовать его в Connect (просто создав поддельное первое подключение).
Редактировать 4< /strong>: Если кто-то может воспроизвести это, присоединитесь к проблеме в Connect.
Редактировать 5: я видел вопрос, упомянутый Томасом, и я проверил, вызывает ли это Console.ReadLine
или нет. Оказалось, что это было. Если я добавлю Thread.Sleep(3000)
перед моим вызовом Console.ReadLine
и сделаю попытку подключения через 3 секунды после запуска программы, это сработает как шарм. Опять же, странно то, что мне нужно сделать это только один раз перед вызовом Console.ReadLine
. Если я сделаю одно соединение перед вызовом Console.ReadLine
, то все последующие соединения будут работать, даже после вызова Console.ReadLine
. Я упомяну об этом на странице подключения.
Редактировать 6: я добавил ссылку на другой вопрос на страницу подключения и добавил еще один обходной путь, который включает вызов Thread.Sleep
перед вызовом Console.ReadLine
, как я упоминал в вышеуказанное редактирование.
Completed
никогда не срабатывает, OnAccept все еще вызывается? - person Peter Ritchie   schedule 14.09.2012