public void TaskQueueDrainTest() { var depth = 10; var taskQueue = new TaskQueue(); taskQueue.SetMaxQueueSize(depth); var wait = true; for (var i = 0; i < depth; i++) { taskQueue.Enqueue(t => Task.Run(() => { while (wait) { Thread.Sleep(10); } }), wait); } wait = false; taskQueue.Drain(); taskQueue.Size.Should().Be(0); var newItem = taskQueue.Enqueue(t => Task.FromResult(0), wait); newItem.Should().NotBeNull(); }
public async Task DrainingTaskQueueShutsQueueOff() { var queue = new TaskQueue(); await queue.Enqueue(() => Task.CompletedTask); await queue.Drain(); // This would throw if the task was queued successfully await queue.Enqueue(() => Task.FromException(new Exception())); }
public void DrainingTaskQueueShutsQueueOff() { var queue = new TaskQueue(); queue.Enqueue(() => TaskAsyncHelper.Empty); queue.Drain(); Task task = queue.Enqueue(() => TaskAsyncHelper.FromError(new Exception())); Assert.True(task.IsCompleted); Assert.False(task.IsFaulted); }
private static Task Drain(TaskQueue queue, ILogger logger) { if (queue == null) { return(TaskAsyncHelper.Empty); } var tcs = new TaskCompletionSource <object>(); queue.Drain().Catch(logger).ContinueWith(task => { tcs.SetResult(null); }); return(tcs.Task); }
public void Stop(TimeSpan timeout) { lock (_startLock) { // Wait for the connection to connect if (_connectTask != null) { try { _connectTask.Wait(timeout); } catch (Exception ex) { Trace(TraceLevels.Events, "Error: {0}", ex.GetBaseException()); } } if (_receiveQueue != null) { // Close the receive queue so currently running receive callback finishes and no more are run. // We can't wait on the result of the drain because this method may be on the stack of the task returned (aka deadlock). _receiveQueue.Drain().Catch(); } // This is racy since it's outside the _stateLock, but we are trying to avoid 30s deadlocks when calling _transport.Abort() if (State == ConnectionState.Disconnected) { return; } Trace(TraceLevels.Events, "Stop"); // Dispose the heart beat monitor so we don't fire notifications when waiting to abort _monitor.Dispose(); _transport.Abort(this, timeout, _connectionData); Disconnect(); } }
public void TaskQueueDrainTest() { var depth = 10; var taskQueue = new TaskQueue(); taskQueue.SetMaxQueueSize(depth); var wait = true; for (var i = 0; i < depth; i++) { taskQueue.Enqueue(t => Task.Run(() => { while (wait) Thread.Sleep(10); }), wait); } wait = false; taskQueue.Drain(); taskQueue.Size.Should().Be(0); var newItem = taskQueue.Enqueue(t => Task.FromResult(0), wait); newItem.Should().NotBeNull(); }
public void Dispose() { _queue.Drain().GetAwaiter().GetResult(); }