コード例 #1
0
        public void MajorityWithFailureTask()
        {
            var timeMachine = new TimeMachine();
            // Second task gives a different result
            var task1 = timeMachine.AddSuccessTask(1, "x");
            var task2 = timeMachine.AddFaultingTask <string>(2, new Exception("Bang!"));
            var task3 = timeMachine.AddSuccessTask(3, "x");

            var resultTask = MoreTaskEx.WhenMajority(task1, task2, task3);

            Assert.IsFalse(resultTask.IsCompleted);

            // Only one result so far - no consensus
            timeMachine.AdvanceTo(1);
            Assert.IsFalse(resultTask.IsCompleted);

            // Second result is a failure
            timeMachine.AdvanceTo(2);
            Assert.IsFalse(resultTask.IsCompleted);

            // Third result gives majority verdict
            timeMachine.AdvanceTo(3);
            Assert.AreEqual(TaskStatus.RanToCompletion, resultTask.Status);
            Assert.AreEqual("x", resultTask.Result);
        }
コード例 #2
0
        public void EarlyFailure()
        {
            var timeMachine = new TimeMachine();
            // Second task gives a different result
            var task1      = timeMachine.AddCancelTask <string>(1);
            var task2      = timeMachine.AddFaultingTask <string>(2, new Exception("Bang 2!"));
            var task3      = timeMachine.AddSuccessTask(3, "x");
            var resultTask = MoreTaskEx.WhenMajority(task1, task2, task3);

            Assert.IsFalse(resultTask.IsCompleted);

            // First result is a cancellation
            timeMachine.AdvanceTo(1);
            Assert.IsFalse(resultTask.IsCompleted);

            // Second result is a failure. We now can't have a successful majority
            timeMachine.AdvanceTo(2);
            Assert.AreEqual(TaskStatus.Faulted, resultTask.Status);
        }