2013-12-19 5 views
1

У меня есть приложение C#, которое прослушивает входящие TCP-соединения и принимает данные из ранее принятых соединений. Помогите мне использовать ли методы Threadpool или Async для написания программы? Обратите внимание, что после того, как соединение принято, оно не закрывает его и непрерывно получает данные от соединения, в то же время он принимает больше соединений.C# Tcp communication Threadpool или asyn call

ответ

0

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

Но если вы хотя бы знаете avg. количество соединений и соединений - это краткосрочные подключения, такие как соединения веб-сервера, тогда лучше сделать это с помощью threadpool, так как вы не будете тратить время на создание потоков для каждого сокета.

+0

Thnaks SAM ...В моем проекте я не знаю, сколько соединений, а также это не краткосрочные подключения ... Я не ознакомлен с асинхронными вызовами. Может, пожалуйста, помогите понять это ... – unni

+0

Я думаю, что пример кода MSDN для асинхронные вызовы ясны и помогут вам понять это. – Mehraban

+0

ok sam..thanks alot – unni

1

Нить потока работает лучше всего, когда код занимает менее половины секунды, и не много ввода-вывода, которое блокирует поток. Это точно противоположный сценарий, который вы описываете.

Использование Socket.BeginReceive() указано здесь. Высоко оптимизированная как на рабочем уровне, так и на каркасе, ваша программа использует один поток для ожидания всего ожидающих чтения для завершения. Масштабирование для работы с тысячами активных соединений вполне возможно.

Написание асинхронного кода может быть довольно сложным, переменные, которые вы обычно делаете локальными переменными в методе, который работает в потоке threadpool, превращаются в поля класса. Для отслеживания состояния соединения вам нужен конечный автомат. Вы получите большую пользу от поддержки async/await, доступной в C# версии 5, которая позволяет превратить эти переменные состояния в локальные переменные. Маленькие обертки, которые вы найдете в this answer или this blog post, помогут вам.

+0

В соответствии с моим требованием, серверное приложение прослушивает новые подключения и по мере принятия каждого соединения принимает данные фиксированной длины из принятых соединений в течение 15 секундных интервалов, а также принимает новые соединения – unni

+0

Не знаю, пытаясь сказать мне, я не думаю, что это влияет на ответ вообще. –

0

Прежде всего, если возможно, не используйте TCP/IP. Вместо этого я рекомендую вам использовать хост WebAPI и/или SignalR. Но если вы решите использовать TCP/IP ...

Вы должны всегда использовать асинхронные API-интерфейсы для сокетов. В идеале вы хотите постоянно читать из сокета и периодически писать (keepalive messages, если ничего больше). Что вы не хотите хотите, чтобы у вас было время, когда вы только читаете (например, ожидаете следующего сообщения) или время, когда вы только пишете (например, отправляете сообщение). Когда вы читаете, вы должны периодически писать; и когда вы пишете, вы должны постоянно читать.

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

Возможно, вы найдете мой TCP/IP .NET Sockets FAQ.

0

Определенно использовать разъемы asynchronous ... Не рекомендуется блокировать поток, ожидающий IO.

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

Это позволит вам создать асинхронное решение с более низким профилем памяти. Однако некоторые считают, что использование событий с сокетами является awkard и немного неуклюжим ... если вы попадете в эту категорию, вы можете взглянуть на это сообщение в блоге, чтобы использовать ключевые слова .NET 4.5 async/await: http://blogs.msdn.com/b/pfxteam/archive/2011/12/15/10248293.aspx#comments