我有一个C#应用程序,它侦听传入的TCP连接并从先前接受的连接接收数据。请帮我,无论我使用Threadpool还是Async方法来编写程序?请注意,一旦连接被接受,它不会关闭它,并不断接收来自连接的数据,同时它可以接受更多连接。C#Tcp通信线程池或异步调用
回答
它主要取决于您想要如何处理连接。如果你有不知道的连接数量,你不知道他们会打开多久,我认为最好是使用异步调用。
但是,如果你至少知道平均。连接数量和连接是短期连接(如Web服务器的连接),那么最好使用线程池来完成,因为您不会浪费时间为每个套接字创建线程。
线程池线程在代码占用不到半秒的时间内效果最佳,并且不会阻塞线程的很多I/O。这与你描述的情况完全相反。
使用Socket.BeginReceive()在这里强烈表示。在操作级别和框架都进行了高度优化,您的程序使用单线程等待所有待完成的读取操作完成。处理数千个活动连接的缩放比较可行。
干净地编写异步代码可能相当困难,您通常会将在线程池线程上运行的方法中的局部变量变成类的字段。您需要一个状态机来跟踪连接状态。您将从C#版本5中的异步/等待支持中受益匪浅,该支持允许您将这些状态变量转换回局部变量。您在this answer或this blog post中找到的小包装将有很大帮助。
根据我的要求,服务器应用程序侦听新连接,并且每个连接都被接受,它在15秒的时间间隔内接受来自已接受连接的固定长度数据并接受新连接 – unni
不知道你是什么试图告诉我,我认为它根本不影响答案。 –
首先,如果可能的话,不要使用TCP/IP。我建议您自行托管WebAPI和/或SignalR。但是,如果你决定使用TCP/IP ...
你应该总是使用异步API的套接字。理想情况下,您希望不断地从套接字读取数据并定期写入(Keepalive消息,如果没有其他的话)。 想要做的是让你有时间只读(例如等待下一条信息)或者只写信息(例如发送信息)。当你阅读时,你应该定期写作;当你写作时,你应该不断阅读。
这可以帮助您检测半开连接,并避免死锁。
您可能会发现我的TCP/IP .NET Sockets FAQ有帮助。
一定要使用asynchronous
套接字......阻止等待IO
的线程永远不是一个好主意。
如果您认为您有高性能需求,则应考虑在套接字中使用EAP
设计模式。
这将允许您创建一个具有较低内存配置文件的异步解决方案。然而,有些人发现,使用套接字的事件是笨拙的,有点笨重......如果你属于这个类别,你可以看看这篇博客文章,使用.NET 4.5的async/await
关键字:http://blogs.msdn.com/b/pfxteam/archive/2011/12/15/10248293.aspx#comments
- 1. 异步使用线程池?
- 2. 异步线程间通信
- 3. 爪哇 - 异步 - 线程池
- 4. TCP套接字异步通信
- 5. 异步通信线程的JOptionPane
- 6. 异步串行通信线程选项
- 7. 线程或异步?
- 8. 线程与异步调用
- 9. 异步信号主线程
- 10. 线程池替换许多std ::异步调用
- 11. C#异步串行通信
- 12. c中的异步通信
- 13. Python中的异步性和线程池
- 14. ejb 3.1 JBoss AS 7线程池@异步
- 15. 用于tcp通信的线程
- 16. C#异步委托,线程调度
- 17. .NET线程池工作线程和异步IO线程
- 18. 调试线程池在C#
- 19. 线程池,多线程,异步等。我应该使用什么?
- 20. 总是使用线程池线程进行异步连续
- 21. WinRT跨线程同步异步调用
- 22. 如何使用异步线程调整/分析线程池配置?
- 23. C++异步线程在调用线程完成时终止
- 24. 在线程池中复用C#5.0的异步 - 线程安全吗?
- 25. 在主线程或异步任务上的Android TCP连接
- 26. 同步线程通信?
- 27. 异步通信
- 28. 多线程,线程间通信,同步
- 29. TCP线程池(地址已在使用)
- 30. C#线程池同步查询
Thnaks SAM ...在我的项目中,我不知道连接的数量,也不是短期连接...我不熟悉异步调用..可以帮助理解它... – unni
我认为MSDN示例代码异步通话很明确,并会帮助您理解这一点。 – Mehraban
确定山姆..感谢很多 – unni