加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:25:08 所属栏目:百科 来源:网络整理
导读:我在.NET中看到的关于socket的一切都表明,异步模式提供了更好的性能(特别是使用新的SocketAsyncEventArgs来节省分配). 我认为这是有道理的,如果我们在谈论一个服务器有许多客户端连接,其中不可能每个连接分配一个线程.然后我可以看到使用ThreadPool线程并获
我在.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.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读