非阻塞套接字与BeginXXX对比SocketAsyncEventArgs

时间:2012-02-27 10:48:01

标签: c# .net sockets networking nonblocking

任何人都可以请教我当前的.NET套接字技术吗?

  1. 非阻塞套接字

    如果我设置Socket.Blocking = false并使用异步操作 - 会发生什么?

    是否有任何轮询多个非阻塞套接字的方法,而不是逐个检查它们的可用性(类似于普通的select()或任何其他机制,一些与IOCP相关的机制)除了Socket.Select( )?

  2. BeginXXX和SocketAsyncEventArgs

    他们是否正在操作引擎盖下的阻塞套件并隐藏线程创建?

    手动创建线程是否等于使用BeginXXX方法?

    有没有其他专业人士使用SocketAsyncEventArgs,那么它是否允许创建套接字池以及与它们相关的所有内容?

  3. 最后一个问题:如果app作为某种负载很重的二进制代理工作,大多数逻辑在单线程中完成 - 什么提供了更好的可伸缩性:非阻塞方法或异步操作?

1 个答案:

答案 0 :(得分:2)

1:Socket.Select应该这样做,尽管我不倾向于亲自使用这种方法;特别是那些IList在高容量时会感到烦恼

2:不,反过来;阻塞操作基本上是在后台使用非阻塞,但是使用门。不,他们不会在引擎盖下创建线程 - 除非你在入站时计算回调。我在这里有一个使用SocketAsyncEventArgs提供12k连接的示例 - 线程计数类似于20. SocketAsyncEventArgs的意图是:

  • 在没有为每次操作创建/收集大量对象的情况下,有效地汇集更容易
  • 你可以非常有效地处理“数据现在可用”的情况,而根本不需要回调(如果方法返回false,则意味着立即处理数据 - 不会回调)

对于可伸缩性:async