Асинхронные методы уже создают новые потоки для отправки данных. Это, вероятно, добавит ненужные накладные расходы на ваше приложение. Если у вас уже есть несколько потоков, вы можете создать объект типа IDispoable для представления доступа к сокету и диспетчера, который будет контролировать возврат и извлечение сокета. Сокет будет регистрироваться при вызове метода удаления IDisposable. Таким образом, вы можете контролировать, какие методы могут выполнять ваши потоки в сокете.
Если сокет уже извлечен другим потоком, менеджер просто заблокирует его, пока он не станет доступным.
using (SharedSocket socket = SocketManager.GetSocket())
{
//do things with socket
}