У меня есть приложение C#, которое прослушивает входящие TCP-соединения и принимает данные из ранее принятых соединений. Помогите мне использовать ли методы Threadpool или Async для написания программы? Обратите внимание, что после того, как соединение принято, оно не закрывает его и непрерывно получает данные от соединения, в то же время он принимает больше соединений.C# Tcp communication Threadpool или asyn call
ответ
В основном это зависит от того, что вы хотите делать с вашими подключениями. Если у вас неизвестное количество подключений, которые вы не знаете, как долго они будут открыты, я думаю, что лучше делать это с помощью асинхронных вызовов.
Но если вы хотя бы знаете avg. количество соединений и соединений - это краткосрочные подключения, такие как соединения веб-сервера, тогда лучше сделать это с помощью threadpool, так как вы не будете тратить время на создание потоков для каждого сокета.
Нить потока работает лучше всего, когда код занимает менее половины секунды, и не много ввода-вывода, которое блокирует поток. Это точно противоположный сценарий, который вы описываете.
Использование Socket.BeginReceive() указано здесь. Высоко оптимизированная как на рабочем уровне, так и на каркасе, ваша программа использует один поток для ожидания всего ожидающих чтения для завершения. Масштабирование для работы с тысячами активных соединений вполне возможно.
Написание асинхронного кода может быть довольно сложным, переменные, которые вы обычно делаете локальными переменными в методе, который работает в потоке threadpool, превращаются в поля класса. Для отслеживания состояния соединения вам нужен конечный автомат. Вы получите большую пользу от поддержки async/await, доступной в C# версии 5, которая позволяет превратить эти переменные состояния в локальные переменные. Маленькие обертки, которые вы найдете в this answer или this blog post, помогут вам.
В соответствии с моим требованием, серверное приложение прослушивает новые подключения и по мере принятия каждого соединения принимает данные фиксированной длины из принятых соединений в течение 15 секундных интервалов, а также принимает новые соединения – unni
Не знаю, пытаясь сказать мне, я не думаю, что это влияет на ответ вообще. –
Прежде всего, если возможно, не используйте TCP/IP. Вместо этого я рекомендую вам использовать хост WebAPI и/или SignalR. Но если вы решите использовать TCP/IP ...
Вы должны всегда использовать асинхронные API-интерфейсы для сокетов. В идеале вы хотите постоянно читать из сокета и периодически писать (keepalive messages, если ничего больше). Что вы не хотите хотите, чтобы у вас было время, когда вы только читаете (например, ожидаете следующего сообщения) или время, когда вы только пишете (например, отправляете сообщение). Когда вы читаете, вы должны периодически писать; и когда вы пишете, вы должны постоянно читать.
Это поможет вам обнаружить полуоткрытые соединения, а также избежать взаимоблокировок.
Возможно, вы найдете мой TCP/IP .NET Sockets FAQ.
Определенно использовать разъемы asynchronous
... Не рекомендуется блокировать поток, ожидающий IO
.
Если вы решите, что у вас есть высокие эксплуатационные требования, вам следует подумать об использовании шаблона дизайна EAP
для ваших сокетов.
Это позволит вам создать асинхронное решение с более низким профилем памяти. Однако некоторые считают, что использование событий с сокетами является awkard и немного неуклюжим ... если вы попадете в эту категорию, вы можете взглянуть на это сообщение в блоге, чтобы использовать ключевые слова .NET 4.5 async/await
: http://blogs.msdn.com/b/pfxteam/archive/2011/12/15/10248293.aspx#comments
- 1. Looping TCP Communication C++
- 2. операции базы данных с помощью Threadpool или Asyn программирования
- 3. TCP IP Communication
- 4. iPhone TCP Communication
- 5. TCP socket communication
- 6. Perl TCP socket communication
- 7. TCP Communication Behavior
- 8. Django TCP socket communication
- 9. ValueError on TCP communication Python
- 10. Parse.com Javascript Asyn Call в Loop
- 11. TCP Communication + Java Socket + ReadTimeoutException
- 12. TCP ThreadPool (адрес уже используется)
- 13. TCP Client - loop in communication
- 14. C# - ThreadPool QueueUserWorkItem Использовать?
- 15. Android to Windows tcp-communication delay
- 16. REST call TCP handshake
- 17. Как отправить команду на гипертерминал (TCP/IP Communication) из C#.
- 18. Создать threadpool от ThreadPoolTaskExecutor или ThreadPoolExecutorFactoryBean?
- 19. C# ThreadPool или BeginInvoke без EndInvoke
- 20. Interprocess Communication в C++
- 21. Thread/threadpool или backgroundworker
- 22. ThreadPool или Task.Factory
- 23. C# wcf duplex communication
- 24. windows serial communication C++
- 25. C - execvp() interprocess communication
- 26. php C++ communication
- 27. C# inter-thread communication
- 28. C++ ThreadPool не работает параллельно
- 29. C# ThreadPool - OutOfMemoryException
- 30. C# и Threadpool
Thnaks SAM ...В моем проекте я не знаю, сколько соединений, а также это не краткосрочные подключения ... Я не ознакомлен с асинхронными вызовами. Может, пожалуйста, помогите понять это ... – unni
Я думаю, что пример кода MSDN для асинхронные вызовы ясны и помогут вам понять это. – Mehraban
ok sam..thanks alot – unni