Недавно я начал использовать класс System.Net.Sockets, представленный в Mango выпуск WP7 и в целом наслаждались им, но заметили несоответствие в задержке передачи данных в режиме отладки и нормальной работе на телефоне.
Я пишу приложение для «дистанционного управления», которое передает один байт на локальный сервер в моей локальной сети через Wi-Fi, когда пользователь нажимает кнопку в приложении. Следовательно, воспринимаемая скорость отклика / своевременность приложения очень важна для хорошего взаимодействия с пользователем.
Когда телефон подключен к моему компьютеру через USB-кабель и приложение запущено в режиме отладки, TCP-соединение передает пакеты так же быстро, как пользователь нажимает кнопки.
Когда телефон отключен от ПК, пользователь может нажать до 7 кнопок (и, таким образом, в случае 7 команд «отправить» с 1 байтом полезной нагрузки будут отправлены все 7 байтов). Если пользователь нажмет кнопку и немного подождет. между нажатиями кажется задержка в 1 секунду.
Я пробовал установить Socket.NoDelay как на True, так и на False, и, похоже, это не имело значения.
Чтобы увидеть, что происходит, я использовал анализатор пакетов, чтобы увидеть, как выглядит трафик.
Когда телефон был подключен через USB к ПК (который использовал соединение Wi-Fi), каждый отдельный байт находился в собственном пакете с интервалом ~ 200 мс.
Когда телефон работал с собственным Wi-Fi-соединением (отключенным от USB), байты по-прежнему содержали свои собственные пакеты, но все они были сгруппированы вместе в пакеты по 4 или 5 пакетов, и каждая группа находилась на расстоянии ~ 1000 мс от следующей. .
Между прочим, время отклика от моей сети Wi-Fi до сервера составляет всего 2 мс, если измерять с моего ноутбука.
Я понимаю, что буферизация «отправляет» вместе, вероятно, позволяет телефону экономить энергию, но есть ли способ отключить эту «задержку»? Скорость отклика приложения важнее, чем экономия энергии.