linux中的OS时,C#中的函数Socket.Select()是否使用epoll?

Does the function Socket.Select() in C# use epoll when OS in linux?

我知道I/O多路复用有3种方式:select,Linux.I中的poll和epoll搞不懂C#函数Socket.Select()直接用select 不然会用epoll 当OS 支持.

如果不使用epoll哪个函数呢?比如java中的selector.select,当OS支持

时会使用epoll

.net core 使用 epoll 进行异步 Socket.xxxAsync 操作。 https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/

对于 Socket.Select() 调用链是 Socket.Select() -> SocketPal.Unix.cs -> SelectViaPoll -> Interop.Sys.Poll -> Interop.Poll -> [DllImport(Libraries.SystemNative, EntryPoint = "SystemNative_Poll")] internal static extern unsafe Error Poll(PollEvent* pollEvents, uint eventCount, int timeout, uint* triggered); -> Common_Poll -> inline static int32_t Common_Poll(PollEvent* pollEvents, uint32_t eventCount, int32_t milliseconds, uint32_t* triggered) -> poll()

对于异步操作: Socket.RecieveFromAsync() -> SocketAsyncContext.Unix ReceiveFromAsync() -> _receiveQueue.StartAsyncOperation() -> SocketAsyncEngine.TryRegister();

然后我们去SocketAsyncEngine.EventLoop() -> Interop.SocketEvent.cs _> SystemNative_WaitForSocketEvents -> WaitForSocketEventsInner -> epoll()

参见 Github 上的 PAL 代码。如果系统有epoll就会编译进去。