У меня есть именованный сервер, написанный на C #.Суть реализации:
void BeginWaitForNextConnection()
{
var pipe = new NamedPipeServerStream(
PipeName,
PipeDirection.InOut,
NamedPipeServerStream.MaxAllowedServerInstances,
PipeTransmissionMode.Byte,
PipeOptions.Asynchronous,
0, // default in buffer size
0, // default out buffer size
CreateAllAccessPipeSecurity());
pipe.BeginWaitForConnection(ClientRequestHandler, pipe);
}
void ClientRequestHandler(IAsyncResult ar)
{
// Clean up the async call state.
NamedPipeServerStream pipe = (NamedPipeServerStream)ar.AsyncState;
pipe.EndWaitForConnection(ar);
// If we've been asked to shut down, go away.
if (_stopping)
{
pipe.Close();
return;
}
// Set up for the next caller.
BeginWaitForNextConnection();
// Handle this client's I/O. This code wraps the pipe stream in BinaryReader and BinaryWriter objects and handles communication with the client.
HandlePipeClient(pipe);
}
Это прекрасно работает - пока несколько экземпляров не попытаются соединиться в быстрой последовательности.В моем клиентском коде указан 10-секундный тайм-аут, поэтому я ожидаю, что даже если 10 экземпляров попытаются подключиться в одну и ту же секунду, все они будут успешными, потому что для этого кода не потребуется 10 секунд, чтобы циклически пройти 10 итераций ClientRequestHandler
обратные вызовы в BeginWaitForNextConnection
- но это действительно то, что я вижу.Для случайного одноразового соединения этот код очень надежен, но если я получаю частые запросы, возможно, если между обратным вызовом и следующим * 1006 поступит запрос на соединение, это соединение не будет поставлено в очередь ибыть немедленно поднятым - это просто теряется.
Это ожидается ??Каково идиоматически правильное решение?Должен ли я просто наматывать целую кучу потоков , ожидающих подключения сразу?