Mic*_*lli 10 .net c# sockets asynchronous tcp
我在.NET中读到的关于套接字的一切都说异步模式提供了更好的性能(特别是使用新的SocketAsyncEventArgs可以节省分配).
我认为如果我们谈论的是具有许多客户端连接的服务器,而不能为每个连接分配一个线程,这是有道理的.然后我可以看到使用ThreadPool线程并获得异步回调的优势.
但在我的应用程序中,我是客户端,我只需要通过一个tcp连接收听一个服务器发送市场价格数据.现在,我创建一个线程,将优先级设置为Highest,并使用它调用Socket.Receive().我的线程阻止此调用,并在新数据到达后唤醒.
如果我将其切换为异步模式,以便在有新数据时收到回调,我会看到两个问题
线程池线程将具有默认优先级,因此看起来它们将严格地比具有最高优先级的我自己的线程更糟糕.
我仍然需要在某个时刻通过单个线程发送所有内容.假设我几乎同时在N个不同的线程池线程上得到N个回调,通知我有新数据.它们提供的N字节数组无法在线程池线程上处理,因为无法保证它们代表N个唯一的市场数据消息,因为TCP是基于流的.我将不得不锁定并将字节放入数组中,并发出一些其他线程的信号,这些线程可以处理数组中的内容.所以我不确定N线程池线程是什么让我买.
我在想这个错吗?是否有理由在我的特定情况下使用Async模式连接到一个服务器的一个客户端?
更新:
所以我认为我误解了上面(2)中的异步模式.当有数据可用时,我会在一个工作线程上得到回调.然后我会开始另一个异步接收并获得另一个回调等.我不会同时得到N个回调.
但问题仍然是一样的.是否有任何理由在我特定的情况下回调会更好,我是客户端并且只连接到一台服务器.
应用程序中最慢的部分是网络通信.通过调整这样的事情,你很可能对一个线程,一个连接客户端的性能几乎没有影响.网络通信本身将使处理或上下文切换时间的所有其他贡献相形见绌.
假设我几乎同时在N个不同的线程池线程上得到N个回调,通知我有新数据.
为什么会发生这种情况?如果你有一个套接字,你Begin就可以对它进行操作来接收数据,并且在完成后你只需要一个回调.然后,您决定是否进行其他操作.这听起来像是你过于复杂,尽管我可能会过度简化你想要做的事情.
总而言之,我会说:选择最简单的编程模型,让你得到你想要的东西; 考虑到您的场景中可用的选择,无论您选择哪一个,他们都不太可能对性能产生任何明显的差异.使用阻塞模型,你"浪费"一个可以做一些真正工作的线程,但是嘿......也许你没有任何真正的工作要做.