private void ShutdownTimeoutHandler(object state) { LinkedListNode <ShutdownAsyncRequest <Response> > listNode = (LinkedListNode <ShutdownAsyncRequest <Response> >)state; ShutdownAsyncRequest <Response> shutdownAsyncRequest = listNode.Value; if (shutdownAsyncRequest != null && shutdownAsyncRequest.TryLock()) { lock (@lock) { if (listNode.List != null) { request = null; } } shutdownAsyncRequest.Dispose(); shutdownAsyncRequest.SetResult(_httpHelper.ServerShutdownTimeout); } }
public Task <Response> AwaitShutdown(CancellationTokenSource cancellationToken, int timeout) { lock (@lock) { cancellationToken.Cancel(); if (timeout == 0) { return(Task.FromResult(_httpHelper.ServerShutdownTimeout)); } request = new ShutdownAsyncRequest <Response>(); var listNode = new LinkedListNode <ShutdownAsyncRequest <Response> >(request); if (timeout != Timeout.Infinite) { request.Timer = new Timer(shutdownTimeoutHandler, listNode, timeout, Timeout.Infinite); } return(request.Task); } }