Snooganz's answerから派生した回答を次に示します。可用性のテストとその後のバインドの間の競合状態を回避します。
public static bool TryBindListenerOnFreePort(out HttpListener httpListener, out int port)
{
// IANA suggested range for dynamic or private ports
const int MinPort = 49215;
const int MaxPort = 65535;
for (port = MinPort; port < MaxPort; port++)
{
httpListener = new HttpListener();
httpListener.Prefixes.Add($"http://localhost:{port}/");
try
{
httpListener.Start();
return true;
}
catch
{
// nothing to do here -- the listener disposes itself when Start throws
}
}
port = 0;
httpListener = null;
return false;
}
私のマシンでは、この方法は平均で 15 ミリ秒かかりますが、これは私のユース ケースでは許容範囲です。これが他の誰かに役立つことを願っています。