Socket и TCPClient довольно просты в управлении и эффективны. Они обязательно сделают то, что вам нужно. Есть множество веских причин использовать асинхронные режимы любого из них.
Имейте в виду, что существуют некоторые проблемы с многопоточностью. Например, некоторые из асинхронных методов завершатся при выходе из вызывающего потока. Существует множество очень неэффективных / плохих примеров многопоточных серверов .NET, поэтому будьте осторожны. И последнее, на что нужно обратить внимание - это обработка исключений. Часто вы просто возвращаете «SocketException» и должны проверить его, чтобы выяснить, что на самом деле произошло. Было бы здорово, если бы было еще несколько производных классов SocketException, которые могли бы обрабатываться независимо.
Но не позвольте мне вас обескуражить, когда ваш код будет реализован и работает, он будет продолжать "просто работать" с тех пор.