diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs index 5891df44ca..0bc8fae781 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs @@ -165,9 +165,8 @@ namespace Microsoft.AspNet.Server.Kestrel.Http // the exception that stopped the event loop will never be surfaced. if (Thread.FatalError == null) { - Thread.Send(state => + Thread.Send(listener => { - var listener = (ListenerSecondary)state; listener.DispatchPipe.Dispose(); listener.FreeBuffer(); }, this); diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs index a8608de70f..93c30a55dd 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Server.Kestrel /// public class KestrelThread { - private static Action _objectCallbackAdapter = (callback, state) => ((Action)callback).Invoke(state); + private static Action _threadCallbackAdapter = (callback, state) => ((Action)callback).Invoke((KestrelThread)state); private KestrelEngine _engine; private readonly IApplicationLifetime _appLifetime; private Thread _thread; @@ -64,15 +64,15 @@ namespace Microsoft.AspNet.Server.Kestrel return; } - Post(OnStop, null); + Post(t => t.OnStop()); if (!_thread.Join((int)timeout.TotalMilliseconds)) { try { - Post(OnStopRude, null); + Post(t => t.OnStopRude()); if (!_thread.Join((int)timeout.TotalMilliseconds)) { - Post(OnStopImmediate, null); + Post(t => t.OnStopImmediate()); if (!_thread.Join((int)timeout.TotalMilliseconds)) { #if NET451 @@ -100,12 +100,12 @@ namespace Microsoft.AspNet.Server.Kestrel } } - private void OnStop(object obj) + private void OnStop() { _post.Unreference(); } - private void OnStopRude(object obj) + private void OnStopRude() { _engine.Libuv.walk( _loop, @@ -120,17 +120,17 @@ namespace Microsoft.AspNet.Server.Kestrel IntPtr.Zero); } - private void OnStopImmediate(object obj) + private void OnStopImmediate() { _stopImmediate = true; _loop.Stop(); } - public void Post(Action callback, object state) + private void Post(Action callback) { lock (_workSync) { - _workAdding.Enqueue(new Work { CallbackAdapter = _objectCallbackAdapter, Callback = callback, State = state }); + _workAdding.Enqueue(new Work { CallbackAdapter = _threadCallbackAdapter, Callback = callback, State = this }); } _post.Send(); } @@ -149,23 +149,6 @@ namespace Microsoft.AspNet.Server.Kestrel _post.Send(); } - public Task PostAsync(Action callback, object state) - { - var tcs = new TaskCompletionSource(); - lock (_workSync) - { - _workAdding.Enqueue(new Work - { - CallbackAdapter = _objectCallbackAdapter, - Callback = callback, - State = state, - Completion = tcs - }); - } - _post.Send(); - return tcs.Task; - } - public Task PostAsync(Action callback, T state) { var tcs = new TaskCompletionSource(); @@ -183,7 +166,7 @@ namespace Microsoft.AspNet.Server.Kestrel return tcs.Task; } - public void Send(Action callback, object state) + public void Send(Action callback, T state) { if (_loop.ThreadId == Thread.CurrentThread.ManagedThreadId) { @@ -295,7 +278,12 @@ namespace Microsoft.AspNet.Server.Kestrel { if (work.Completion != null) { - ThreadPool.QueueUserWorkItem(_ => work.Completion.SetException(ex), null); + ThreadPool.QueueUserWorkItem( + tcs => + { + ((TaskCompletionSource)tcs).SetException(ex); + }, + work.Completion); } else {