public void Add(Task task) { if (_tasks.Count >= _poolSize) { var tasks = _tasks.Keys.ToArray(); try { Task.WaitAny(tasks); } catch (Exception ex) { Fail(ex); return; } } _tasks.TryAdd(task, true); task.Then(() => { RemoveTask(task); }).Catch(ex => { RemoveTask(task); Fail(ex); }); }
public Task Then_NoInputValue_WithReturnValue_IncompleteTask_RunsOnNewThreadAndPostsContinuationToSynchronizationContext() { // Arrange int originalThreadId = Thread.CurrentThread.ManagedThreadId; int callbackThreadId = Int32.MinValue; var syncContext = new Mock<SynchronizationContext> { CallBase = true }; SynchronizationContext.SetSynchronizationContext(syncContext.Object); Task incompleteTask = new Task(() => { }); // Act Task resultTask = incompleteTask.Then(() => { callbackThreadId = Thread.CurrentThread.ManagedThreadId; return 42; }); // Assert incompleteTask.Start(); return resultTask.ContinueWith(task => { Assert.NotEqual(originalThreadId, callbackThreadId); syncContext.Verify(sc => sc.Post(It.IsAny<SendOrPostCallback>(), null), Times.Once()); }); }
private void OnTransactionCompleting(RedisTransaction transaction, Task<bool> transactionTask, IList<Message> messages, TaskCompletionSource<object> tcs) { if (transactionTask.IsCompleted) { try { OnTransactionComplete(transaction, transactionTask.Result, messages, tcs); } catch (OperationCanceledException) { tcs.TrySetCanceled(); } catch (Exception ex) { tcs.TrySetException(ex); } } else { transactionTask.Then(result => OnTransactionComplete(transaction, result, messages, tcs)) .ContinueWithNotComplete(tcs); } }