我在SMTP邮件服务器( LumiSoft邮件服务器 )的代码中find以下代码。 根据方法名称,testing平台是否支持I / O完成端口 。
/// <summary> /// Gets if IO completion ports supported by OS. /// </summary> /// <returns></returns> public static bool IsIoCompletionPortsSupported() { Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp); try{ SocketAsyncEventArgs e = new SocketAsyncEventArgs(); e.SetBuffer(new byte[0],0,0); e.RemoteEndPoint = new IPEndPoint(IPAddress.Loopback,111); s.SendToAsync(e) return true; } catch(NotSupportedException nX){ string dummy = nX.Message; return false; } finally{ s.Close(); } }
它似乎工作正常,但在Mono / Linux上失败。 SendToAsync
方法就像它的名字一样,是asynchronous执行的。 它甚至在另一个线程中执行。 但是,当它开始执行时,此方法的finally部分已经closures了套接字,并在另一个线程中导致ObjectDisposedException
。
那么,testingIOCP支持是否是一种不正确的技术? 为什么它在Windows上工作? testingIOCP支持的正确方法是什么?
测试简单地确定异步操作是否导致NotSupportedException
。 测试代码不关心完成它的异步操作,只是在被调用时抛出异常。
编写测试的人可能会认为异步操作意味着IOCP支持,而且这个测试应该被命名为“IsAsyncOperationSupported()”。
我认为mono / linux不支持异步操作,因为缺少IOCP支持,编写测试的人知道这个…