Я пытаюсь использовать именованные каналы впервые. В документации MS, найденной здесь , говорится, что:
EndWaitForConnection должен вызываться ровно один раз для каждого вызова
BeginWaitForConnection.
Поэтому я стараюсь быть хорошим программистом и слежу за документацией, но EndWaitForConnection()
просто зависает на неопределенное время, когда я его использую. * * 1010
Итак, я сократил свой код до минимума, чтобы посмотреть, смогу ли я выделить проблему, но без кубиков. Я вытащил следующий код из класса, который я написал. Я изменил его так, что он начинает ожидать подключения к каналу, а затем сразу же пытается остановить ожидание на этом подключении канала:
private void WaitForConnectionCallBack(IAsyncResult result)
{
}
public void Start()
{
var tempPipe = new NamedPipeServerStream("TempPipe",
PipeDirection.In,
254,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous);
IAsyncResult result = tempPipe.BeginWaitForConnection(
new AsyncCallback(WaitForConnectionCallBack), this);
tempPipe.EndWaitForConnection(result); // <----- Hangs on this line right here
}
1) Почему висит на EndWaitForConnection()
? Если я хочу закрыть свой сервер до получения соединения, как я могу по существу отменить этот BeginWaitForConnection()
обратный вызов?
2) Давайте предположим, что у меня не было вышеупомянутой проблемы. Что произойдет, если 2 клиента попытаются подключиться к моему именованному каналу очень быстро?
Получу ли я обратный вызов для каждого из них, или мне нужно подождать, чтобы получить уведомление о первом подключении, затем быстро позвонить EndWaitForConnection()
, а затем WaitForConnectionCallBack()
снова, чтобы снова начать прослушивание следующего клиента?
Последнее кажется мне условием гонки, потому что я не могу настроить слушателя соединения достаточно быстро.