c# – 同步异步插座在.NET中的性能

前端之家收集整理的这篇文章主要介绍了c# – 同步异步插座在.NET中的性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在.NET中看到的关于socket的一切都表明,异步模式提供了更好的性能(特别是使用新的SocketAsyncEventArgs来节省分配).

我认为这是有道理的,如果我们在谈论一个服务器有许多客户端连接,其中不可能每个连接分配一个线程.然后我可以看到使用ThreadPool线程并获得异步回调的优点.

但在我的应用程序中,我是客户端,我只需要听一个服务器通过一个tcp连接发送市场滴答数据.现在,我创建一个线程,将优先级设置为Highest,并调用Socket.Receive().一旦新数据到达,我的线程将阻塞该呼叫并唤醒.

如果我要将其切换到异步模式,以便在有新数据时得到回调,我会看到两个问题

>线程池线程将具有默认优先级,所以看起来它们将比我自己的具有最高优先级的线程更严格.
>我还需要通过一个线程发送所有东西.说我在几个不同的线程池线程上几乎同时收到N个回调通知我有新的数据.他们提供的N字节数组不能在线程池线程处理,因为不能保证它们代表N个独特的市场数据消息,因为TCP是基于流的.我必须锁定并将字节放入数组,并发出一些可以处理数组中的内容的其他线程.所以我不知道有什么N线程池线程正在买我.

我在想这个错了吗?是否有理由在一个客户端连接到一个服务器的特定情况下使用Async模式?

更新:

所以我认为我在上面(2)中误解了异步模式.当有数据可用时,我会在一个工作线程上得到一个回调.然后我将开始另一个异步接收并获得另一个回调等.我不会同时得到N个回调.

问题还是一样的.有什么原因,我的特定情况下,回调会更好,只连接到一个服务器.

解决方法

您应用程序中最慢的部分将是网络通信.一个线程,一个连接客户端通过调整这样的事情,几乎没有什么不同的性能.网络通信本身将减少对处理或上下文切换时间的所有其他贡献.

Say that I get N callbacks at almost
the same time on N different
threadpool threads notifying me that
there’s new data.

为什么会发生?如果您有一个套接字,您可以开始一个操作来接收数据,完成之后就会得到一个回调.然后,您决定是否进行其他操作.这听起来像是你过度的夸张,但也许我对你想要做什么过于简单.

总之,我会说:选择最简单的编程模型,让你得到你想要的东西;考虑到您的场景中可用的选择,他们不太可能对性能产生任何明显的影响,无论您使用哪一种.使用阻挡模型,您正在“浪费”一个线程,可能正在做一些真正的工作,但嘿…也许你没有任何真正的工作要做.

原文链接:https://www.f2er.com/csharp/95667.html

猜你在找的C#相关文章