Пример #1
0
 public IntModelIncrementThreeEtor(RestrictionTester restrictionTester)
 {
     _restrictionTester = restrictionTester;
 }
        public async Task AsyncPipeMultipleExecutionsWithRestriction()
        {
            var restriction  = new RestrictionTester();
            var execIncOne   = new IntModelIncrementOneEtor();
            var execIncTwo   = new IntModelIncrementTwoEtor();
            var execIncThree = new IntModelIncrementThreeEtor(restriction);

            var pipe = PipeBuilder
                       .AsyncPipe <IntModel, int>()
                       .Executor(execIncOne).Label("exec_1").Add()
                       .Executor(execIncTwo).Label("exec_2").Add()
                       .Executor(execIncThree).Label("exec_3")
                       .Restricted(3, "rest_1")
                       .Add()
                       .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var execIncOne1   = new IntModelIncrementOneEtor();
            var execIncTwo1   = new IntModelIncrementTwoEtor();
            var execIncThree1 = new IntModelIncrementThreeEtor(restriction);

            var pipe1 = PipeBuilder
                        .AsyncPipe <IntModel, int>()
                        .Executor(execIncOne1).Label("exec_1").Add()
                        .Executor(execIncTwo1).Label("exec_2").Add()
                        .Executor(execIncThree1).Label("exec_3")
                        .Restricted(3, "rest_1")
                        .Add()
                        .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var execIncOne2   = new IntModelIncrementOneEtor();
            var execIncTwo2   = new IntModelIncrementTwoEtor();
            var execIncThree2 = new IntModelIncrementThreeEtor(restriction);

            var pipe2 = PipeBuilder
                        .AsyncPipe <IntModel, int>()
                        .Executor(execIncOne2).Label("exec_1").Add()
                        .Executor(execIncTwo2).Label("exec_2").Add()
                        .Executor(execIncThree2).Label("exec_3")
                        .Restricted(3, "rest_1")
                        .Add()
                        .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var execIncOne3   = new IntModelIncrementOneEtor();
            var execIncTwo3   = new IntModelIncrementTwoEtor();
            var execIncThree3 = new IntModelIncrementThreeEtor(restriction);

            var pipe3 = PipeBuilder
                        .AsyncPipe <IntModel, int>()
                        .Executor(execIncOne3).Label("exec_1").Add()
                        .Executor(execIncTwo3).Label("exec_2").Add()
                        .Executor(execIncThree3).Label("exec_3")
                        .Restricted(3, "rest_1")
                        .Add()
                        .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var execIncOne4   = new IntModelIncrementOneEtor();
            var execIncTwo4   = new IntModelIncrementTwoEtor();
            var execIncThree4 = new IntModelIncrementThreeEtor(restriction);

            var pipe4 = PipeBuilder
                        .AsyncPipe <IntModel, int>()
                        .Executor(execIncOne4).Label("exec_1").Add()
                        .Executor(execIncTwo4).Label("exec_2").Add()
                        .Executor(execIncThree4).Label("exec_3")
                        .Restricted(3, "rest_1")
                        .Add()
                        .Return((model, results) =>
            {
                Assert.Equal(3, results.Length);
                return(PipeResult <int>
                       .DefaultSuccessful
                       .SetValue(model.Integer));
            });

            var length = 20;
            var array  = new int[length];

            for (int i = 0; i < length; i++)
            {
                var pipeTask = pipe.ExecuteAsync(new IntModel {
                    Integer = 0
                });
                var pipeTask1 = pipe1.ExecuteAsync(new IntModel {
                    Integer = 0
                });
                var pipeTask2 = pipe2.ExecuteAsync(new IntModel {
                    Integer = 0
                });
                var pipeTask3 = pipe3.ExecuteAsync(new IntModel {
                    Integer = 0
                });
                var pipeTask4 = pipe4.ExecuteAsync(new IntModel {
                    Integer = 0
                });

                var results = await Task.WhenAll(pipeTask, pipeTask1, pipeTask2, pipeTask3, pipeTask4);

                Assert.True(restriction.MaxCount < 4);
                array[i] = restriction.MaxCount;
            }
            var avg = array.Average();
            var max = array.Max();
        }