2013-12-19 29 views
1

我有一个C#应用程序,它侦听传入的TCP连接并从先前接受的连接接收数据。请帮我,无论我使用Threadpool还是Async方法来编写程序?请注意,一旦连接被接受,它不会关闭它,并不断接收来自连接的数据,同时它可以接受更多连接。C#Tcp通信线程池或异步调用

回答

0

它主要取决于您想要如何处理连接。如果你有不知道的连接数量,你不知道他们会打开多久,我认为最好是使用异步调用。

但是,如果你至少知道平均。连接数量和连接是短期连接(如Web服务器的连接),那么最好使用线程池来完成,因为您不会浪费时间为每个套接字创建线程。

+0

Thnaks SAM ...在我的项目中,我不知道连接的数量,也不是短期连接...我不熟悉异步调用..可以帮助理解它... – unni

+0

我认为MSDN示例代码异步通话很明确,并会帮助您理解这一点。 – Mehraban

+0

确定山姆..感谢很多 – unni

1

线程池线程在代码占用不到半秒的时间内效果最佳,并且不会阻塞线程的很多I/O。这与你描述的情况完全相反。

使用Socket.BeginReceive()在这里强烈表示。在操作级别和框架都进行了高度优化,您的程序使用单线程等待所有待完成的读取操作完成。处理数千个活动连接的缩放比较可行。

干净地编写异步代码可能相当困难,您通常会将在线程池线程上运行的方法中的局部变量变成类的字段。您需要一个状态机来跟踪连接状态。您将从C#版本5中的异步/等待支持中受益匪浅,该支持允许您将这些状态变量转换回局部变量。您在this answerthis blog post中找到的小包装将有很大帮助。

+0

根据我的要求,服务器应用程序侦听新连接,并且每个连接都被接受,它在15秒的时间间隔内接受来自已接受连接的固定长度数据并接受新连接 – unni

+0

不知道你是什么试图告诉我,我认为它根本不影响答案。 –

0

首先,如果可能的话,不要使用TCP/IP。我建议您自行托管WebAPI和/或SignalR。但是,如果你决定使用TCP/IP ...

你应该总是使用异步API的套接字。理想情况下,您希望不断地从套接字读取数据并定期写入(Keepalive消息,如果没有其他的话)。 想要做的是让你有时间只读(例如等待下一条信息)或者只写信息(例如发送信息)。当你阅读时,你应该定期写作;当你写作时,你应该不断阅读。

这可以帮助您检测半开连接,并避免死锁。

您可能会发现我的TCP/IP .NET Sockets FAQ有帮助。

0

一定要使用asynchronous套接字......阻止等待IO的线程永远不是一个好主意。

如果您认为您有高性能需求,则应考虑在套接字中使用EAP设计模式。

这将允许您创建一个具有较低内存配置文件的异步解决方案。然而,有些人发现,使用套接字的事件是笨拙的,有点笨重......如果你属于这个类别,你可以看看这篇博客文章,使用.NET 4.5的async/await关键字:http://blogs.msdn.com/b/pfxteam/archive/2011/12/15/10248293.aspx#comments