测试I / O完成端口支持

时间:2010-11-21 23:00:32

标签: c# linux mono iocp

我在SMTP邮件服务器的代码中找到了以下代码(LumiSoft Mail Server)。根据方法的名称,它测试平台是否支持I/O Completion Ports

/// <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以异步方式执行。它甚至在另一个线程中执行。但是,当它开始执行时,此方法的finally部分已经关闭套接字并在另一个线程中导致ObjectDisposedException

那么,测试IOCP支持的技术是不正确的?为什么它适用于Windows?测试IOCP支持的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

测试只是确定异步操作是否导致NotSupportedException。测试代码不关心异步操作,完成它只关心它是否在被调用时抛出异常。

编写测试的人可能认为异步操作意味着IOCP支持,并且该测试应该真正命名为“IsAsyncOperationSupported()”。

我认为由于缺乏IOCP支持,mono / linux不支持任何地方的异步操作,编写测试的人知道这一点......