В рамках задачи, которую я сейчас работаю, мне нужно создать несколько конечных точек Tcp/Ip. Я был удивлен, осознав, что это так медленно. Ниже приведен пример кода:Почему Socket Accept занимает около 1 секунды?
var started = new AutoResetEvent(false);
for (int i = 20000; i < 20050; i++)
{
var watch = Stopwatch.StartNew();
started.Reset();
Task.Run(() =>
{
var listener = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp
);
listener.Bind(new IPEndPoint(
IPAddress.Parse("127.0.0.1"), i)
);
listener.Listen(1);
started.Set();
var handler = listener.Accept();
// here goes work after socket is opened
// code omitted for brevity
});
started.WaitOne();
watch.Stop();
Console.WriteLine("Openned in ---> {0}",
watch.ElapsedMilliseconds);
}
Вот пример вывода.
Openned in ---> 73
Openned in ---> 0
Openned in ---> 0
Openned in ---> 570
Openned in ---> 999
Openned in ---> 1000
Openned in ---> 999
Openned in ---> 998
Openned in ---> 998
Openned in ---> 1000
Openned in ---> 1000
Openned in ---> 998
Openned in ---> 998
Openned in ---> 1000
В качестве части теста никто еще не должен подключаться, а это означает, что он блокируется в строке Accept(). Кто может указать мне, почему это происходит?
Что вы делаете в пропущенном коде? – Fredou
@Fredou пропущенный код передает 'handler' другому thred – ruslander
Почему бы вам не использовать' Task.Run' ?! – Aron