Это действительно интересный вопрос!Я собираюсь бросить свои 2 цента, но, пожалуйста, имейте в виду, я не эксперт по System.Net.Sockets на WP7.
Во-первых, тестирование производительности в отладчике следует игнорировать.Причина этого заключается в том, что дополнительные издержки на запись трассировки стека всегда замедляют работу приложений, независимо от ОС / языка / IDE.Приложения должны быть профилированы для производительности в режиме выпуска и отключены от отладчика.В вашем случае это на самом деле медленнее отключен!Итак, давайте попробуем оптимизировать это.
Если вы подозреваете, что пакеты буферизуются (и это разумное предположение), вы пытались отправить пакет большего размера?Попробуйте линейно увеличить размер пакета и измерить задержку.Не могли бы вы написать на устройстве простой микро-профилировщик в коде , т. Е. Использовать класс DateTime.Now или секундомер для регистрации задержки по сравнению с размером пакета.Построение графика может дать вам хорошее представление о том, верна ли ваша теория.Если вы обнаружите, что 10-байтовые (или даже 100-байтовые) пакеты отправляются мгновенно, я бы посоветовал просто передавать больше данных за одну передачу.Я знаю, что это глупый хак, но если он не сломался ...
Наконец, вы говорите, что используете TCP.Можете ли вы попробовать UDP вместо этого?TCP предназначен не для связи в реальном времени, а для точной связи.UDP, напротив, не проверяется на ошибки, вы не можете гарантировать доставку, но вы можете ожидать от него более быстрой (более легкой, меньшей задержки) производительности.Сети, такие как Skype и онлайн-игры, построены на UDP, а не на TCP.Если вам действительно нужно подтверждение получения, вы всегда можете создать свой собственный микропротокольный протокол по UDP, используя собственную проверку циклическим избыточным кодом для проверки ошибок и протокол запроса / ответа (подтверждения) .
Такие протоколы существуют, взгляните на Надежный UDP , обсуждаемый в этого предыдущего вопроса .Существует реализация RUDP на основе Java, но я уверен, что некоторые части могут быть перенесены в C #.Конечно, первый шаг - проверить, действительно ли UDP помогает!
Нашел этот предыдущий вопрос, в котором обсуждается проблема.Возможно, проблема с Wp7? Низкая производительность UDP с Windows Phone 7.1 (Mango)
Тем не менее, было бы интересно узнать, работает ли увеличение размера пакета или переключение на UDP
нормально, так что никаких предложенийработал.Я нашел это описание алгоритма Nagle, который группирует пакеты, как вы описываете.Настройка NoDelay должна помочь, но, как вы говорите, не помогает.
http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.nodelay.aspx
Также.Посмотрите этот предыдущий вопрос, где Keepalive и NoDelay были включены / выключены для ручной очистки очереди.Его свидетельство анекдотично, но стоит попробовать.Можете ли вы попробовать и отредактировать свой вопрос, чтобы публиковать более свежие результаты?
Сокет "Flush", временно включив NoDelay