2012-01-04 1 views
3

Есть ли более быстрый способ узнать, имеются ли у клиента данные? Я не говорю, что медленно использовать TcpClient.Available, но мне любопытно узнать, является ли это самым быстрым способом.TcpClient.Available Optimizations

+0

В каком сценарии использования? Если у вас есть тонна сокетов, и вы хотите знать, станет ли кто-нибудь из них понятным, Socket.Select может быть интересным. – harold

+0

Пожалуйста, не прикрепите свои заголовки к «C#» и тому подобное. Для этого нужны теги. –

ответ

2

TcpClient.Available не замедляет сам по себе, он просто зависит от того, как вы его используете.

Если вы используете его только для проверки, есть ли доступные данные, то это путь.

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

public void Receive() 
{ 
    while (tcpClient.Connected) 
    { 
     if (tcpClient.Available >= 0) 
     { 
      // Do something 
     } 
    } 
} 

Для этого второго сценария, вы можете добиться того, что вы хотите с помощью либо:

  • Асинхронный читает (смотреть на NetworkStream.BeginRead) => наиболее масштабируемой
  • Blocking (см. предлагаемое решение here, в котором используется NetworkStream.Read)
1

Если вам нужно знать, имеются ли данные, и вы не собираетесь ничего делать с данными, это, вероятно, самый быстрый подход.

Но если вы хотите опросить, есть ли что-нибудь, чтобы пойти и прочитать, используйте асинхронный ввод-вывод: запустите асинхронную операцию чтения (BeginRead), и как только поступят какие-либо данные, вы будете вызваны обрабатывать его. Это будет намного быстрее (и более эффективно), чем опрос, чтобы увидеть, могут ли быть некоторые данные.