Я нашел следующий код в коде почтового сервера SMTP ( LumiSoft Mail Server ). Согласно названию метода, он проверяет, поддерживает ли платформа Порты завершения ввода / вывода .
/// <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?