У меня есть сервер с несколькими клиентами C1 ... Cn, к каждому из которых установлено TCP-соединение.Количество клиентов составляет менее 10 000.
Протокол сообщений основан на запросе / ответе, когда сервер отправляет запрос клиенту, а затем клиент отправляет ответ.
Сервер имеет несколько потоков, T1 ... Tm, и каждый из них может отправлять запросы любому из клиентов.Я хочу убедиться, что только один из этих потоков может одновременно отправить запрос определенному клиенту, в то время как другие потоки, желающие отправить запрос тому же клиенту, должны будут ждать.
Я делаюне хочет блокировать потоки от одновременной отправки запросов различным клиентам.
Например, если T1 отправляет запрос на C3, другой поток T2 не должен иметь возможность отправлять что-либо на C3, пока T1 не получит свой ответ.
Я думал об использовании простого оператора блокировки для сокета:
lock (c3Socket)
{
// Send request to C3
// Get response from C3
}
Я использую асинхронные сокеты, поэтому мне, возможно, придется использовать Monitor вместо:
Monitor.Enter(c3Socket); // Before calling .BeginReceive()
И
Monitor.Exit(c3Socket); // In .EndReceive
Я беспокоюсь о том, что что-то пошло не так и не отпустит монитор и, следовательно, заблокирует весь доступ к клиенту.Я думаю, что мой поток сердцебиения может использовать Monitor.TryEnter () с таймаутом и выбрасывать сокеты, для которых он не может получить монитор.
Имеет ли смысл делать синхронные вызовы Begin и End синхроннымидля того, чтобы иметь возможность использовать оператор lock ()?Я знаю, что в этом случае я бы пожертвовал параллелизмом ради простоты, но, возможно, оно того стоит.
Я что-то здесь упускаю?Любой вклад приветствуется.