NetworkStream, есть ли что-то похожее на DataReceived для SerialPort? (С #) - PullRequest
6 голосов
/ 06 августа 2009

Хорошо, поэтому я немного озадачен тем, почему я нигде не могу найти это, или если его нет, то почему Microsoft не реализовала это?

Итак, вот мой сценарий, у меня есть NetworkStream, в котором есть симпатичный маленький логический элемент с именем DataAvailable, и мне нужно событие, которое выскакивает и говорит: «Эй, есть данные для вас!» (потому что я ленивый, и мне скорее сказали бы, что есть доступные данные, чем продолжать спрашивать «Хорошо, есть ли какие-либо данные?» снова и снова, пока я не получу ответ «На самом деле, на этот раз есть»).

Что-то похожее на SerialPort (с хорошим событием (DataReceived), которое любезно сообщает мне, что данные принимаются из порта), было бы неплохо. Но я использую Socket с NetworkStream.

Направьте меня в правильном направлении, если есть что-то явно очевидное, что я упускаю, но если нет, значит ли это, что мне придется использовать какое-то Привязывание данных к свойству DataAvailable, и когда оно установлено в true, назвать свое собственное «домашнее» событие / функцию? Если это так, то не могли бы вы привести небольшой пример, как начать игру?

Редактировать
Мой идеальный ответ - чтобы кто-нибудь пришел и объяснил мне, как я могу найти / создать нечто, очень похожее на событие DataReceived, используемое с SerialPort, но реализованное для сокета, который транслируется через NetworkStream!

Еще раз спасибо заранее, оценили.

Ответы [ 2 ]

7 голосов
/ 06 августа 2009

Просто, чтобы уточнить ответ Томаса с объяснением для всех, кто не знаком с методом BeginRead и хочет понять ответ на этот вопрос, вы можете позвонить:

AsyncCallBack MyCallBack = new AsynCallBack(DataReceived);
networkStream.BeginRead(buffer, offset, size, MyCallBack, MyObject);

затем создайте функцию DataReceived:

private void DataReceived(IAsynResult result)
  {
  //call receive functionality
  }

Это вызовет DataReceived, очень похожее на то, как работает событие SerialPort.DataReceived.

2 голосов
/ 06 августа 2009

Нет событий в классе NetworkStream ( см. MSDN ). NetworkStream наследуется от Stream, поэтому следует модели потока, которая не основана на событиях. Если вам нужно получить данные асинхронно, используйте метод BeginRead

...