Я вижу неожиданное поведение, хотя и не обязательно вызывающее проблему, которую я хотел бы понять в отношении программирования асинхронных сокетов.
Речь идет о выполнении вызова mySocket.BeginConnect и его вызове предоставленного AsyncCallback.,С некоторым тестовым проектом для сетевого взаимодействия, я вижу, что для того же кода предоставляемый обратный вызов иногда вызывается синхронно во время выполнения BeginConnect, а иногда асинхронно (BeginConnect уже возвращал IASyncResult до завершения обратного вызова), причем последний случай является наиболее распространенным(80% - 90% случаев).
Однако я не могу воспроизвести синхронный обратный вызов с помощью очень простого контрольного примера с сокетным tcp-клиентом и сервером, который просто спамит соединяет / отключает вызовы.
Я проверил исходный код платформы .NET Core 2.2 и увидел, что базовый класс LazyAsyncResult имеет два конструктора, один из которых вызывает синхронный вызов в своем конструкторе.Тем не менее, я не нашел ни одного случая, когда этот конструктор используется фреймворком.Кажется, что вызовы, которые я выполнял с помощью отладчика, всегда создают ContextAwareResult, у которого есть только вызов базового конструктора для другого конструктора.Я могу в некоторых из этих тестовых случаев также ясно видеть в отладчике, что свойство CompletedSynchronously возвращает true.
Любые подсказки, в каком сценарии этот обратный вызов вызывается синхронно и почему?
Cheers.
Редактировать:
- Тестирование проводилось в Windows 10.
- Точно такой же код в полной среде .NET 4.6.2 делает создание всегда асинхронным.