Что происходит, когда несколько асинхронных вызовов происходят до завершения делегатов? - PullRequest
0 голосов
/ 20 марта 2012

Я пытаюсь написать довольно простое приложение, которое передает данные между двумя сокетами. Однако я немного запутался в использовании асинхронных операций NetworkStream (BeginRead и EndRead).

Например:

while (myNetworkStream.DataAvailable)
  myNetworkStream.BeginRead(mBrowserDataBuffer, 0, mBrowserDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), myNetworkStream);

Когда я вызываю BeginRead, метод немедленно возвращается и запускает поток для выполнения операции чтения. Однако, что в моем цикле выше, что произойдет, если BeginRead будет вызван ОПЯТЬ до завершения делегата?

По сути, я хочу, чтобы мой делегат добавлял входящие данные в больший буфер и затем обрабатывал сообщения по мере их завершения. Мне нужно использовать асинхронные операции, потому что, пока один сокет читает, я хотел бы также читать и обрабатывать из другого сокета.

1 Ответ

1 голос
/ 20 марта 2012

Только один поток должен читать из того же потока.

Одна хитрость заключается в повторном вызове BeginRead в вашем EndRead обратном вызове. Делать это в цикле, как вы показали, не правильно.

...