public Task StartAsync( string pipeName, ServerAddress address, KestrelThread thread, Func <Frame, Task> application) { ServerAddress = address; Thread = thread; Application = application; DispatchPipe = new UvPipeHandle(Log); var tcs = new TaskCompletionSource <int>(); Thread.Post(_ => { try { DispatchPipe.Init(Thread.Loop, true); var connect = new UvConnectRequest(Log); connect.Init(Thread.Loop); connect.Connect( DispatchPipe, pipeName, (connect2, status, error, state) => { connect.Dispose(); if (error != null) { tcs.SetException(error); return; } try { var ptr = Marshal.AllocHGlobal(4); var buf = Thread.Loop.Libuv.buf_init(ptr, 4); DispatchPipe.ReadStart( (_1, _2, _3) => buf, (_1, status2, state2) => { if (status2 < 0) { if (status2 != Constants.EOF) { Exception ex; Thread.Loop.Libuv.Check(status2, out ex); Log.LogError("DispatchPipe.ReadStart", ex); } DispatchPipe.Dispose(); Marshal.FreeHGlobal(ptr); return; } if (DispatchPipe.PendingCount() == 0) { return; } var acceptSocket = CreateAcceptSocket(); try { DispatchPipe.Accept(acceptSocket); } catch (UvException ex) { Log.LogError("DispatchPipe.Accept", ex); acceptSocket.Dispose(); return; } var connection = new Connection(this, acceptSocket); connection.Start(); }, null); tcs.SetResult(0); } catch (Exception ex) { DispatchPipe.Dispose(); tcs.SetException(ex); } }, null); } catch (Exception ex) { DispatchPipe.Dispose(); tcs.SetException(ex); } }, null); return(tcs.Task); }