public IDisposable CreateServer(ServerAddress address, Func<IFeatureCollection, Task> application)
{
var listeners = new List<IDisposable>();
var usingPipes = address.IsUnixPipe;
try
{
var pipeName = (Libuv.IsWindows ? @"\\.\pipe\kestrel_" : "/tmp/kestrel_") + Guid.NewGuid().ToString("n");
var single = Threads.Count == 1;
var first = true;
foreach (var thread in Threads)
{
if (single)
{
var listener = usingPipes ?
(Listener) new PipeListener(this) :
new TcpListener(this);
listeners.Add(listener);
listener.StartAsync(address, thread, application).Wait();
}
else if (first)
{
var listener = usingPipes
? (ListenerPrimary) new PipeListenerPrimary(this)
: new TcpListenerPrimary(this);
listeners.Add(listener);
listener.StartAsync(pipeName, address, thread, application).Wait();
}
else
{
var listener = usingPipes
? (ListenerSecondary) new PipeListenerSecondary(this)
: new TcpListenerSecondary(this);
listeners.Add(listener);
listener.StartAsync(pipeName, address, thread, application).Wait();
}
first = false;
}
return new Disposable(() =>
{
foreach (var listener in listeners)
{
listener.Dispose();
}
});
}
catch
{
foreach (var listener in listeners)
{
listener.Dispose();
}
throw;
}
}
}