System.Net.Sockets.Socket的一个实例可以被两个线程共享,以便其中一个使用send()方法,另一个使用receive()方法吗?
这样做安全吗?
嗯,我需要它不仅是线程安全的,而且send/receive方法也不是同步的,以便让每个线程同时调用它们。
我有其他方法吗?
感谢您的帮助,我在Java方面有经验,但尝试做这个还是遇到了困难。
System.Net.Sockets.Socket的一个实例可以被两个线程共享,以便其中一个使用send()方法,另一个使用receive()方法吗?
这样做安全吗?
嗯,我需要它不仅是线程安全的,而且send/receive方法也不是同步的,以便让每个线程同时调用它们。
我有其他方法吗?
感谢您的帮助,我在Java方面有经验,但尝试做这个还是遇到了困难。
是的,应该是安全的。MSDN引用中提到Socket类是完全线程安全的。
然而我不知道是否是个好主意。通过使用两个线程可能会使自己难以处理。你可能需要查看BeginSend
和BeginReceive
来获取异步版本,在这种情况下,你不需要多个线程。
有点离题,但只有在客户端数量有限时,使用同步方法才有用。我发现异步套接字的响应速度更慢。异步套接字在处理许多客户端方面要好得多。
因此: 同步更快。 异步更具可扩展性。
是的,同时从两个不同的线程访问发送和接收是完全安全的。
如果您希望应用程序扩展到数百个活动套接字,则应使用BeginReceiveve/BeginSend方法,而不是手动创建线程。这将在幕后执行魔法,以便您不会生成100个线程来处理套接字。它确切地做了什么取决于平台。在Windows上,您将使用“高性能”IO完成端口。在Linux(mono)下,我认为您将使用epoll。无论哪种方式,您最终使用的线程比活动套接字少得多,这总是一件好事:)