Евгений, "Они отсылаются сами уже в классе потока сразу после записи в него? " класс TcpClient перенаправляет данные на WinAPI функции, а те в ядре операционной системы формируют пакеты данных и записывают их в память сетевой карты, которая на апаратном уровне передает их дальше. "А как это происходит в других классах stream" Другие классы наследуясь от абстракного класса stream реализуют свой функционал. Часто это просто прокси обертки над WinAPI функциями.
Асинхронный TcpListener НЕ требует для каждого соединения отдельного потока. И можно легко реализовать обработку множества подключений не использую дополнительные потоки.
Так вы посмотрите на чем тормоза возникают. Не должно быть проблем со столь малым числом соединений.
Еще уточните какая версия windows у вас, так как разные версии имеют ограничение на количество concurrent connections.
eRKa, Генерируемый IL код посмотрите, метод с await преобразуется в конечный автомат, то есть функция разбивается на части. И вот та часть, что после await будет выполнена дальше и в контексте изначального вызова функции. Я ничего не говорил о методе, что является параметром конструкции await. Для него можно и ConfigureAwait задать. Еще await не подразумевает многопоточность, он подразумевает многозадачность, и если явно не разрешить задаче выполняться в отдельном потоке (как вы указали ConfigureAwait(false)), то она и не будет. Пример есть тут
"await перед вызовом говорит только, что вызывающий поток освободится." await такого не говорит.
Он означает, что оставшаяся часть кода метода продолжит работу в том же контексте, в котором метод был запущен и не более.
ОС Linux и windows оперируют процессами, то есть приложениями, которым выделяется независимая память и доступ к которой из других процесов ограничивается самой ОС. Редактор это процесс, в который загружаются библиотеки (для windows в основном exe, dll, как в вашем случае SFML+Box2D). Библиотека это контейнер с скомпилированным бинарным кодом и ресурсами.
Линковка это подключение откомпилированных библиотек исходного кода, к вашему коду. Линковка это действие компилятора.
Процесс может загрузить dll с помошью функции LoadLibrary и затем вызвать любую экспортируемую функцию.
Так у вас же 192.168.99.100 это адрес сетевого интерфейса, то есть при доступе из сети, а из Safari на этой же машине у вас должен быть localhost доступ.
Степан Гервик, Для примера возьмем UI приложение. У вас есть основной UI поток. Чтобы не блокировать его работу, код сервера вы запускаете в отдельном потоке. Пример создания потока у вас в вопросе есть, только там он создавался для каждого конекта. При такой архитектуре вам уже не нужны новые потоки, отсылку данных вы будуте производить из UI потока по списку сохраненых соединений.
var clients = new List<TcpClient>(); // -- тут храним
// ...
TcpClient client = listener.AcceptTcpClient();
clients.Add(client); //-- конечно для работы с потоками нужно обеспечить потокобезопасность ))